最近,在工作的过程中,会时不时的碰到要不要添加索引的问题,于是结合自己的经历,忙里偷闲总结下,希望自已以后忘记了可以快速的记忆起来,同时也希望也可以帮助一些跟我一样有需求的小伙伴。
一直以来,我总是不自觉的去想,到底什么是索引?为什么建立索引可以加快查询的速度?直到后面在网上看到一个答案,那就是其实跟查字典是差不多的概念,建立索引其实就是给字典编页码的过程,后面理解起来就简单的多了。
那就废话少说,在下面的这些情况下,我觉得应该是要考虑加索引的:
(1)一张表的主键
(2)表的物理外键
(3)经常用户连接的字段,不管是左连接、还是右连接,还是inner join
(4)表的数据量超过500条记录的
(5)经常用作查询条件的,即使where之后的字段
(6)选择性能高的字段(即某种业务需要的)
然后有一些情况,我觉得应该是考虑不加索引的:
(1)表的某个字段的大小很大,比如Blob类型的
(2)经常进行除了查询之外的操作的表
实际的情况:
(1)and 前后的字段经常出现的,可以考虑创建复合索引,但是如果很少的情况,拆分为单个索引
(2)建立复合索引的时候要记住最左匹配原则,3个字段以上的复合索引要慎重考虑,因为单个索引往往更好
(3)like 查询的时候,如果使用%like%类型的,其实索引是不起效果的,但是like%这种是可以的,所以like语句也要考虑是否真的必要
(4)对于表字段的值为NULL的情况,一旦有了NUL:L其实索引是不起效果的,复合索引的某个字段存在NULL值同样,默认值最好不要使用NULL
(5) mysql查询一次只使用一个索引,如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的,如果需要可以考虑复合索引
(6) NOT IN 操作适当采用NOT EXIST,因为NOT IN会对全表进行扫描
(7) 不要在相关的字段中使用数据库函数,这样索引也是不起效果的
(8) 短索引的使用,比如一些字段是varchar类型的,而且前面的部分是相同的,这个可以考虑创建短索引
目前我个人感觉用的比较多的就上面的这些,其实现在随着mysql的版本的升级,有很多地方数据库引擎都慢慢帮我们做了适当的优化,需要想更好的使用索引,我觉得还是根据版本看文档的比较好,如果还有其他的情况或者又不对的地方,欢迎指教。