每日八股day9 ### 本系列帖子为鼠鼠复习八股巩固记忆和个人理解所写如有错误纯属本人实力不佳欢迎各位大佬阅读指正 ###1.覆盖索引是什么使用场景查询时直接从索引树就能拿到全部数据不需要再回表查聚簇索引。使用场景需要避免回表提升查询速度。统计查询计数查询。只查询少量固定字段。不想让查询触发随机IO回表IO。2.最左前缀原则 原理、为什么要遵守原则建立联合索引a,b,c时MySQL会按照a- ab - abc的顺序去匹配索引跳过前面的字段后面的索引直接失效。原理联合索引在B树里是按顺序排序的先按第一个字段排序相同的情况下再按第二个字段排序如果还相同再按第三个字段排序。为什么遵守不遵守就用不上索引导致全表扫描查询变慢高并发拖垮数据库B树的排序结构决定只能从左往右匹配建立联合索引成本高必须最大化利用。3.索引下推 原理和作用索引下推把本来要回表后才能判断的过滤条件提前在索引遍历阶段就过滤掉减少回表次数。在使用二级索引查询时没有ICP先把符合最左前缀的记录全部回表拿到整行数据再过滤不符合条件的行。开启ICP在索引遍历过程中直接用索引里面包含的字段做判断不符合的直接丢掉只把符合条件的少量记录回表。作用大幅减少回表次数降低磁盘IO减少服务层数据处理量提升查询效率对联合索引模糊查询范围条件场景优化明显。4.什么是索引失效哪些情况会导致索引失效本该走索引的查询结果没走索引变成了全表扫描就是索引失效。那些情况违反最左前缀原则索引列上使用函数/运算模糊查询以%开头使用 / is not null隐式类型转换or 连接条件order by /group by 违反索引规则追问字段类型隐式转换为什么会导致索引失效因为MySQL要在索引字段上加函数做类型转换相当于对索引列使用了函数索引直接失效。5.模糊查询 like % xxx、like xxx% 哪个走索引like % xxx前缀未知整个字段都是无需无法使用B树快速查找只能全表扫描。like xxx% 前缀 固定能在索引树中快速定位范围走索引。6.为什么不建议用 select *查询多余字段浪费性能无法使用索引覆盖一定会回表增加数据库IO开销业务不安全表结构变更容易出问题不利于缓存复用7.联合索引创建顺序原则区分度高区分度高放前面区分度越高过滤越快。长度小长度小放前面索引键越小一页能存更多索引IO更少。经常查询遵循最左前缀原则高频查询放左端才能命中索引。范围查询放最后范围查询会导致后面的索引列失效索引放最后。8.什么时候不适合建索引数据量很小的表全表扫描比走索引快建索引纯浪费。区分度极低的字段过滤效果查优化器直接不走索引。频繁增删改查的表增删改查要同步索引写性能会降低。查询极少几乎不用的字段这种情况下索引占用空间消耗性能。大字段索引体积大效率低。