MySQL底层原创
DBA
# Innodb引擎
- 开启事务
- 事务提交完成
- 写redo日志(同 2. 事务提交一起)日志是顺序写(持久化机制)
- 修改数据()写数据,是随机写
sex in ('female', 'male') 一般in在基数大的数据时,一般会走索引,基数小的数据不一定
# undo日志
# 索引下推 Using index condtion
- 使用联合索引查询数据,遵循最左原则
- MySQL5.6之前,查询语句*,索引查询到区间,先回表然后过滤数据,MySQL5.6之后,先过滤数据然后回表,查询的字段数据包含联合索引的字段+主键字段,则不需要回表查询
# 单路排序与双路排序
-- max_length_for_sort_data通过设置该值设置选择单路还是双路 默认大小1024字节
set max_length_for_sort_data = 10 --表的字段长度综合肯定大于10字节
-- sort buffer大小默认1M
1
2
3
4
2
3
4
单路排序,是将select查出来的数据全部放到sort buffer中排序,排序完就是结果 双路排序,我将要排序出来的字段,加上行id放入sort buffer,排序完,是将排序的字段,还不是结果
# 索引设计原则
- 代码先行,索引后上
- 联合索引尽量覆盖条件
- 不要再小基数字段上建立索引
-- 比如性别,男女区分度不高
长字符串我们可以采用前缀索引
-- varchar(255),长字符,可以采取 key index (name(20),age,position) 将前20个字符放入索引
核心思想:利用一两个复杂的多字段联合索引,抗下80%以上的查询,然后用一两个辅助索引抗下一些非典型查询-----不超过3个联合索引,联合索引增删改效率低
# join
# 有索引字段 会使用嵌套循环连接Nested-Loop Join(NLJ)算法
select * from t1 inner join t2 on t1.a = t2.a -- a字段添加索引
1
# 没有索引字段 会使用基于块的嵌套循环连接Block Nested-Loop Join(BNL)算法
整个过程对表t1和t2做一次全表扫描 在join_buffer中做对比 参数由join_buffer_size设定 默认大小256k 如果一次性放不下,则分段放、批次
select * from t1 join t2 on t1.b = t2.b -- b字段没有索引
1
# 关联sql优化
- 关联字段加索引,让mysql做join操作尽量选择NLJ算法
- 小表驱动大表,大表一定要走索引
上次更新: 2024/07/30, 22:53:10