Administrator
发布于 2026-01-14 / 3 阅读
0

面鸭突击30之Day3

MySQL 中的回表是什么?

回表的概念是查询非聚簇索引的时候查询的结果需要根据从非聚簇索引查出来的主键id回聚簇索引内拿所有数据的操作 非聚簇索引的b+树的索引结构是对应的叶子节点没有全部的数据,只有对应二级索引和主键id,所以当查询的结果没有对应所需的列时,需要拿主键id回聚簇索引内查询对应的列数据,索引避免这种回表的随机io,需要我们建立覆盖索引,也就是查询的列需要是联合索引内的列

MySQL 中使用索引一定有效吗?如何排查索引效果?

不一定,索引是否生效主要是由优化器权衡之后的结果。 1.满足索引的查询条件,但是优化器认为全表扫描更加划得来,就走全表。例如,当我执行一条sql走非聚簇索引,查询80%的数据,但是查询的结果需要回表,大量的随机io,让优化器认为还不如走全表扫来的快,这样优化器可能就不会走索引。数据量极少的表

2.索引失效的场景: 联合索引不符合最左前缀原则,这个有不符合也生效的情况,8.0支持skip scan 以及当查询的结果列全在联合索引内的话,有可 能还是走索引 左%或者中%,不满足b+树索引的左前缀原则 or后的条件没有建索引 order by 或distinct 的列没有索引 隐式的类型转换,varchar的字段比较数值 查询条件的数值运算 函数运算(这个可以创建函数索引) 字符集不一致 3.explan 分析执行计划,主要看一下几个列。 type:索引的类型,常见的有const(主键 / 唯一索引等值匹配,仅 1 条结果) > eq_ref (联表查询中主键 / 唯一索引匹配)> ref (普通索引等值匹配,多条结果)> range(索引范围匹配,如 BETWEENIN) > index(扫描整个索引树,无回表) > ALL (全表扫描) rows :预估的需要扫描的行数 id: 执行顺序的优先级 extra:补充字段:用于解析,例如using index 使用了覆盖索引、using filesort 使用排序(可能是磁盘排序) 、using where 使用了服务层的过。 滤、using temporary 使用了临时表 group by 或者distinct key :走的索引名称,null 就没有走索引 keylen:索引的长度 EXPLAIN ANALYZE(真实执行)(MySQL 8.0+)、慢查询日志、索引使用统计等。

在 MySQL 中建索引时需要注意哪些事项?

适合创建索引与不适合的: 查询频繁字段 区分度大的字段与数据量足够大的表字段 读多写少的表 大字段不适合建索引,索引列越大b+树的扇出率越小,树越高 更新或写入远大于读取的表 建议索引列设置not null 以及给予默认值

order by distict group by 的字段,防止走filesort 和 临时表temporary 补充联合索引的注意事项(最左前缀条件的满足,避免冗余), 补充索引是优化手段,不是百分百能解决问题,数据量大或者索引解决不了的问题,还是得分库分表 补充主键索引尽量短和自增(越短扇出率越大,树越低,自增可以防止页分裂,空间利用率更高) 补充定期对索引做检查,OPTIMIZE TABLE 表名去碎片,排查无用索引。

生产情况下怎么加索引合适:mysql5.6之后的版本onlin ddl 加索引,低峰时期添加,可以不锁表,短暂锁元数据添加索引,可以在从库验证再生产。