文章目录
😊 @ 作者:Lion J
💖 @ 主页: https://blog.csdn.net/weixin_69252724
🎉 @ 主题:关于索引的使用
⏱️ @ 创作时间:2024年04月24日
————————————————
选择合适的字段创建索引
▶不为 NULL 的字段:索引字段的数据应该尽量不为 NULL,因为对于数据为 NULL 的字段,数据库较难优化。如果字段频繁被查询,但又避免不了为 NULL,建议使用 0,1,true,false 这样语义较为清晰的短值或短字符作为替代。
▶被频繁查询的字段:我们创建索引的字段应该是查询操作非常频繁的字段。
▶被作为条件查询的字段:被作为 WHERE 条件查询的字段,应该被考虑建立索引。
频繁需要排序的字段:索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。
▶被经常频繁用于连接的字段:经常用于连接的字段可能是一些外键列,对于外键列并不一定要建立外键,只是说该列涉及到表与表的关系;对于频繁被连接查询的字段,可以考虑建立索引,提高多表连接查询的效率。
被频繁更新的字段应该慎重建立索引
虽然索引能带来查询上的效率,但是维护索引的成本也是不小的。 如果一个字段不被经常查询,反而被经常修改,那么就更不应该在这种字段上建立索引了。
因为每一次修改索引的字段, 那么该字段也需要更新, 因为位置会发生变化, 导致索引位置的频繁切换
限制每张表的索引数量
索引并不是越多越好,建议单张表索引不超过 5 个!
索引可以提高效率同样可以降低效率。索引可以增加查询效率,但同样也会降低插入和更新的效率,甚至有些情况下会降低查询效率。因为 MySQL 优化器在选择如何优化查询时,会根据统一信息,
对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,就会增加 MySQL 优化器生成执行计划的时间,同样会降低查询性能
这就是MySQL再server层的优化功能, 由优化器来决定,如果由多个索引, 那么优化器就需要产生非常多次的计划, 并从中选出最优的, 给SQL优化器带来不小的压力
不要给字符串创建索引
因为字符串的索引相较于普通的索引需要很大的存储空间,而且再修改方面也不简洁
一般使用字符转专用的前缀索引来代替
避免索引的失效
索引失效也是慢查询的主要原因之一,常见的导致索引失效的情况有下面这些
- 使用 SELECT 进行查询; SELECT 不会直接导致索引失效(如果不走索引大概率是因为 where 查询范围过大导致的),但它可能会带来一些其他的性能问题比如造成网络传输和数据处理的浪费、无法使用索引覆盖;
- 创建了组合索引,但查询条件未遵守最左匹配原则;
- 在索引列上进行计算、函数、类型转换等操作;
- 以 % 开头的 LIKE 查询比如 LIKE '%abc';
- 查询条件中使用 OR,且 OR 的前后条件中有一个列没有索引,涉及的索引都不会被使用到;IN 的取值范围较大时会导致索引失效,走全表扫描(NOT IN 和 IN 的失效场景相同);