

























开启并查看慢日志
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 树区别:
使用覆盖索引处理超大分页问题:
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 = 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%'则不会失效)表的设计 (阿里开发手册)
索引创建原则
SQL 语句优化
select指明字段明, 避免 select * ;union all 代替 union (会多一次过滤, 效率低)where 中对字段进行表达式操作join优化尽量用inner join不用left join, right join, 必须要用则要以小表为驱动. inner join会优化, 优先将小表放到外边, 大表放到里面, left/right join则不会主从复制、读写分离
分库分表
| 读未提交 | 读已提交 | 可重复读 | 可串行化 | |
|---|---|---|---|---|
| 脏读 | √ | √ | √ | |
| 不可重复读 | √ | √ | ||
| 幻读 | √ |
MySQL 操作并不会直接操作磁盘,会先将磁盘中的数据拿到内存的 Buffer Pool 中,操作完成后一定频率再持久化到磁盘上。

undo log 记录日志与实际操作相反,事务回滚时实现事务的一致性和原子性
MVCC: Multi-Version Concurrency Control, 多版本并发控制. 维护一个数据的多个版本, 使得读写操作没有冲突.
| 隐藏字段 | 含义 |
|---|---|
| DB_TRX_ID | 最近修改事务 ID, 记录擦汗如这条记录或最后一次修改该记录的事务 ID |
| DB_ROLL_PTR | 回滚指针, 指向这条记录的上一个版本, 用于配合 undo log, 指向上一个版本 |
| DB_ROW_ID | 隐藏主键, 如果表结构没有指定主键, 将会生成该隐藏字段 (没有指定主键时使用) |
ReadView 核心字段
| 字段 | 含义 |
|---|---|
| m_ids | 当前活跃事务 id 集合 |
| min_trx_id | 最小活跃事务 id |
| max_trx_id | 预分配事务 id, 当前最大事务 id+1 |
| creator_trx_id | ReadView 创建者的事务 id |
版本链数据访问规则:
RC: 事务中每一次快照读都会生成 ReadView
RR: 事务中只有第一次快照读生成 ReadView

主从复制类型:
垂直分库: 以表为依据, 根据业务将不同表拆分到不同库中.
垂直分表: 以字段为依据, 根据字段属性将不同字段拆分到不同表中
水平分库: 将一个库的数据拆分到多个库中
水平分表: 将一个表的数据拆分到多个表中
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。