惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
K
Kaspersky official blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
The Exploit Database - CXSecurity.com
Cisco Talos Blog
Cisco Talos Blog
P
Palo Alto Networks Blog
Latest news
Latest news
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Privacy International News Feed
The Hacker News
The Hacker News
T
Tor Project blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Cisco Blogs
阮一峰的网络日志
阮一峰的网络日志
Recent Commits to openclaw:main
Recent Commits to openclaw:main
博客园_首页
N
News and Events Feed by Topic
W
WeLiveSecurity
罗磊的独立博客
GbyAI
GbyAI
T
Troy Hunt's Blog
Y
Y Combinator Blog
Recorded Future
Recorded Future
The Cloudflare Blog
TaoSecurity Blog
TaoSecurity Blog
爱范儿
爱范儿
美团技术团队
Attack and Defense Labs
Attack and Defense Labs
C
Check Point Blog
Engineering at Meta
Engineering at Meta
Cyberwarzone
Cyberwarzone
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
F
Fortinet All Blogs
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
Know Your Adversary
Know Your Adversary
AWS News Blog
AWS News Blog
D
DataBreaches.Net
Recent Announcements
Recent Announcements
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
M
MIT News - Artificial intelligence
Webroot Blog
Webroot Blog
Security Latest
Security Latest
T
Tailwind CSS Blog
V2EX - 技术
V2EX - 技术
aimingoo的专栏
aimingoo的专栏
S
Security @ Cisco Blogs
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed

Chenxu's Blog

RAG检索优化:从 68% 到 82.2% 学习深度学习 北邮计算机研究生选课指北 学习机器学习 上海篇 提出一个好问题 写代码的环境 选购一台合适的设备 计算机的第零课 序言 内蒙古篇 山东篇 一篇对transformers的疑惑 浅析GPUStack 浅谈后端项目分层 浙江篇 河南篇 一些三端协同的开发工具记录 浅谈编程语言中的 GC 在 Windows 上安装 Rust 美化博客 消息队列 MyBatis 现代交换原理2024年题目 回忆版 北邮计科本科课程指北 ClkLog埋点用户分析系统研究报告 大数据梧桐实验分享 大数据HBase实验分享 国产向量数据库研究实践 —— 基于 Milvus 的电影推荐系统 服务器环境配置 大数据HDFS实验分享 SSE多服务之间推送数据 数据库系统原理 操作系统 编译原理 手把手教你gozero从开发到部署 (番外篇): 介绍 gtodolist 前端项目 天津篇 北京篇 手把手教你gozero从开发到部署 (5): gtodolist 之任务的删除 前端相关问题 vue3 + element-plus学习 git相关命令 人工智能原理 使用 MongoTemplate 时开启事务 Redis 力扣刷题笔记之动态规划 记录一次 VSCode 出现的各种奇怪的问题 手把手教你gozero从开发到部署 (4): 在 model 中自己编写函数实现数据库分页查询 记录平时用到的 windows 右键管理 记录平时使用的 linux 的指令 安装 gstore 并使用 java api 手把手教你gozero从开发到部署 (3): gtodolist 之任务的创建和修改 手把手教你gozero从开发到部署 (番外篇): 记录第一次部署 CI/CD 的流程 记录完成 gtodolist 中遇到的 bug 手把手教你gozero从开发到部署 (2): gtodolist 之 user 模块开发 手把手教你gozero从开发到部署 (1): gtodolist 项目说明和环境准备 快速入门 gozero 框架 vue部署在nginx上的相关问题 记一次安装scrapy的报错 将博客部署至服务器 Java CS143: Compliers 《MySQL必知必会》读书笔记(2) 初识 GORM 初识 gin 框架 Spring 《MySQL必知必会》读书笔记(1) 本地搭建博客 🤝友链 🙋🏻‍♂️关于 Browser and Device Check
MySQL
Chenxu · 2023-09-29 · via Chenxu's Blog

优化

慢查询

开启并查看慢日志

slow_query_log=1
# 多长时间的日志会被视为慢查询被记录
long_query_time=2

分析慢查询语句: explain/desc 查询语句

  • possible_keys: 可能用到的索引
  • key: 实际用到的索引
  • key_len: 实际用到的索引的大小
  • extra: 额外的建议
    • using where;using index: 查找使用了索引, 需要的数据都在索引中找到, 不需要回表
    • using index condition: 查找使用了索引, 但是需要回表查询数据, 使用了索引下推(在引擎层使用索引中的字段进行过滤, 减少返回给 server 层的数据, 从而减少回表次数)
    • using filesort: order by 中使用的字段没有被索引覆盖
  • type: sql 连接类型, 性能好到差为: NULL > system (mysql 系统的表) > const (主键查询) > eq_ref (主键索引或者唯一索引, 返回一条数据) > ref (索引查询, 可能多条数据) > range (索引, 范围查询) > index (索引树查询) > all (全表查询)

索引

B+树和 B 树区别:

  • B+树在非叶子节点上只存储指针不存储数据, 查询代价更低
  • 叶子节点之间有双向指针, 便于区间查询

使用覆盖索引处理超大分页问题:

select * from user limit 1000000, 10;

上述语句会查询 10000010 条数据, 然后舍弃前 1000000 条数据, 可以用覆盖索引+子表查询进行优化

select * from user u,
    (select id from user order by id limit 1000000, 10) t
where u.id = t.id;

子查询中使用了覆盖索引进行查询和排序

最左前缀法则: 如果索引了多列, 需要遵守最左前缀法则. 查询从索引的最左前列开始, 并且不跳过索引中的列.

索引失效:

  • 违反最左前缀法则, 则索引失效; 或者符合法则但是跳过某一列, 则只有最左列索引起效. 复合索引(a, b, c), a = 1 and c = 3, 只有 a 使用了索引
  • 范围查询右边的列不能使用索引. a = 1 and b > 2 and c = 3, a, b, c 都有索引, 则只有 a 和 b 索引生效
  • 在索引列上进行运算操作. substring(a, 1, 1) = 1, a 的索引失效
  • 字符串不加单引号(也就是类型转换)
  • %开头的like模糊查询, 如a like '%aa', 索引会失效 (但如果只是尾部模糊匹配, 如a like 'aa%'则不会失效)

优化方法

  • 表的设计 (阿里开发手册)

    • 合适数值类型: tinyint, int, bigint
    • 合适字符串类型: char 定长效率高, varchar 变长效率低
  • 索引创建原则

  • SQL 语句优化

    • select指明字段明, 避免 select * ;
    • SQL 避免索引失效
    • 使用 union all 代替 union (会多一次过滤, 效率低)
    • 避免在 where 中对字段进行表达式操作
    • join优化尽量用inner join不用left join, right join, 必须要用则要以小表为驱动. inner join会优化, 优先将小表放到外边, 大表放到里面, left/right join则不会
  • 主从复制、读写分离

  • 分库分表

事务

  • 原子性(Atomicity): 事务是不可分割的最小单元, 要么全部成功, 要么全部失败;
  • 一致性(Consistency): 事务完成时, 必须使所有的数据都保持一致状态;
  • 隔离性(Isolation): 数据库系统提供的隔离机制, 保证事务在不受外部并发操作影响的独立环境下运行;
  • 持久性(Durability):事务一旦提交或回滚, 它对数据库中的数据的改变就是永久性的;
读未提交 读已提交 可重复读 可串行化
脏读
不可重复读
幻读

MySQL 操作并不会直接操作磁盘,会先将磁盘中的数据拿到内存的 Buffer Pool 中,操作完成后一定频率再持久化到磁盘上。

undo log 记录日志与实际操作相反,事务回滚时实现事务的一致性和原子性

MVCC

MVCC: Multi-Version Concurrency Control, 多版本并发控制. 维护一个数据的多个版本, 使得读写操作没有冲突.

隐藏字段 含义
DB_TRX_ID 最近修改事务 ID, 记录擦汗如这条记录或最后一次修改该记录的事务 ID
DB_ROLL_PTR 回滚指针, 指向这条记录的上一个版本, 用于配合 undo log, 指向上一个版本
DB_ROW_ID 隐藏主键, 如果表结构没有指定主键, 将会生成该隐藏字段 (没有指定主键时使用)
  • undo log 版本链: 不同事务或相同事务对同一条记录修改, 会导致该记录的 undo log 生成一条记录版本链表, 头是最新的旧记录, 尾是最早的旧记录
  • ReadView: 快照读执行时 MVCC 提取数据的依据, 记录并维护系统当前活跃的事务(未提交)id

ReadView 核心字段

字段 含义
m_ids 当前活跃事务 id 集合
min_trx_id 最小活跃事务 id
max_trx_id 预分配事务 id, 当前最大事务 id+1
creator_trx_id ReadView 创建者的事务 id

版本链数据访问规则:

  • trx_id == creator_trx_id 可以访问, 数据是当前事务更改的
  • trx_id < min_trx_id 可以访问, 数据已经提交
  • trx_id > max_trx_id 不可以访问, 事务在 ReadView 创建后开启
  • min_trx_id <= trx_id <= max_trx_id trx_id 不在 m_ids 中则可以访问, 说明已提交

RC: 事务中每一次快照读都会生成 ReadView

RR: 事务中只有第一次快照读生成 ReadView

主从同步

主从复制类型:

  • 异步:默认方式,发送给 slave 后不管结果
  • 同步:所有 slave 完成事务后 master 再提交该事务
  • 半同步:有一个 slave 写入到 relay log 后返回 commit,master 完成该事务,slave 后续步骤仍为异步

分库分表

垂直拆分

  • 垂直分库: 以表为依据, 根据业务将不同表拆分到不同库中.

    1. 按业务对数据分级管理, 维护, 监控, 扩展
    2. 高并发下, 提高磁盘 IO 和数据量连接数
  • 垂直分表: 以字段为依据, 根据字段属性将不同字段拆分到不同表中

    1. 冷热数据分离
    2. 减少 IO 过度争抢, 两表互不影响

水平拆分

  • 水平分库: 将一个库的数据拆分到多个库中

  • 水平分表: 将一个表的数据拆分到多个表中

    1. 优化但仪表数据量过大而产生的性能问题
    2. 避免 IO 争抢并减少锁表的几率