关于索引的主要事项
不要在列上进行运算
不要在列上进行运算,这将导致索引失效而进行全表扫描。例如
select * from user where YEAR(birthday)<1990 <="" code="">
可以改造成
select * from users where birthday <’1990-01-01′ <="" code="">
还有一个建议,不要在列上使用函数,这也将导致索引失效而进行全表扫描。
单列索引与多列索引
一个常见的错误。为多个列创建独立的索引,大部分并不能提高MySQL的查询性能。因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
组合索引的最右前缀原则
MySQL组合索引“最左前缀”原则,指的是MySQL只能高效地使用索引的最左前缀列。所以,在多列索引中索引列的顺序至关重要。如果不是按照索引的最左列开始查找,则无法使用索引。例如,你在用户表上创建了一个多列索引t_index(sex,age),如果你这个时候没有查找某个特定的性别,这个索引时无法使用的。
范围查询对多列查询的影响
如果查询中的某个列有范围查询,则其右边所有列都无法使用索引优化查找。举个例子,你有个查询
where age>10 and age<90 and="" name="lianggzone" <="" code="">
这是因为age是范围查询,导致多列索引t_index(age,name),无法用到sex索引。
索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
覆盖索引的好处
如果一个索引包含所有需要的查询的字段的值,我们称之为覆盖索引。覆盖索引是非常有用的工具,能够极大的提高性能。因为,只需要读取索引,而无需读表,极大减少数据访问量。
like语句的索引问题
like语句,在like “value%”可以使用索引,但是like “%value%”不会使用索引,走的是全表扫描。这在数据量小的表,不存在性能问题,但是对于海量数据,全表扫描是非常可怕的事情。所以,对于业务需求,考虑使用MySQL全文索引,或者使用solr或者es是个不错的方案。