什么时候需要 / 不需要创建索引?

参考链接

https://xiaolincoding.com/mysql/index/index_interview.html#%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%E9%9C%80%E8%A6%81-%E4%B8%8D%E9%9C%80%E8%A6%81%E5%88%9B%E5%BB%BA%E7%B4%A2%E5%BC%95

索引最大的好处是提高查询速度,但是索引也是有缺点的,比如:

  1. 需要占用物理空间,数量越大,占用空间越大;
  2. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增大;
  3. 会降低表的增删改的效率,因为每次增删改索引,B+ 树为了维护索引有序性,都需要进行动态维护。

所以,索引不是万能钥匙,它也是根据场景来使用的。

什么时候适用索引?

  1. 唯一性约束列: 字段有唯一性限制的,比如商品编码;
  2. 频繁用于查询条件的列: 经常用于 WHERE 查询条件的字段,这样能够提高整个表的查询速度,如果查询条件不是一个字段,可以建立联合索引。
  3. 经常用于排序和分组的列: 经常用于 GROUP BY 和 ORDER BY 的字段,这样在查询的时候就不需要再去做一次排序了,因为建立索引之后在 B+Tree 中的记录都是排序好的。
  4. 经常用于连接操作的列: 如果某个列经常用于连接操作,例如JOIN操作中的列,那么为该列创建索引可以加速连接操作。

什么时候不需要创建索引?

1.很少使用的列: WHERE 条件,GROUP BY,ORDER BY 里用不到的字段,索引的价值是快速定位,如果起不到定位的字段通常是不需要创建索引的,因为索引是会占用物理空间的。
2. 数据分布均匀的列: 字段中存在大量重复数据,不需要创建索引,比如性别字段,只有男女,如果数据库表中,男女的记录分布均匀,那么无论搜索哪个值都可能得到一半的数据。在这些情况下,还不如不要索引,因为 MySQL 还有一个查询优化器,查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。
3. 小表中的列: 表数据太少的时候,不需要创建索引;
4. 频繁更新的列: 经常更新的字段不用创建索引,比如不要对电商项目的用户余额建立索引,因为索引字段频繁修改,由于要维护 B+Tree的有序性,那么就需要频繁的重建索引,这个过程是会影响数据库性能的

发生索引失效的情况:

  1. 使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx%这两种方式都会造成索引失效;
  2. 在查询条件中对索引列做了计算、函数、类型转换操作,这些情况下都会造成索引失效;
  3. 联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配,否则就会导致索引失效。
  4. 在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。

参考链接

https://xiaolincoding.com/mysql/index/index_interview.html#%E9%98%B2%E6%AD%A2%E7%B4%A2%E5%BC%95%E5%A4%B1%E6%95%88

https://mp.weixin.qq.com/s/lEx6iRRP3MbwJ82Xwp675w

你可能感兴趣的:(mysql,数据库)