> 非独立的列

  • 索引不能是表达式的一部分,不能让索引列参与运算,下面是一个失效的例子:
SELECT * FROM table WHERE id +1 = 5;
  • 索引列不能是函数的参数:
SELECT * FROM table WHERE TO_DAYS(CURRENT_DATE) - TO_DAY(date_col) <= 10;

> 索引列配合like使用时以%通配符开头

SELECT * FROM table WHERE name LIKE '%meng'		#索引失效
SELECT * FROM table WHERE name LIKE 'meng%'		#索引有效

> or关键词左右有一个不是索引

or关键字左右两侧的字段都必须是索引列才会生效,有一个不是则无效。比如id建了索引,但是Pid不是索引列

SELECT * FROM table WHERE id = 5 or pid = 10;  #索引失效

> 联合索引

联合索引在查询的时候必须遵循最左匹配原则才可是索引生效。如果我给表的name、alexa、country设置了索引,如果查询时没有带name,那么索引将失效

select * from websites where alexa=1 and name="Google" and country = "USA"; #索引有效,即使第一个索引没有排在第一
select * from websites where alexa=1 and name="Google";											#索引失效

> 存在类型转换

如果一个字符串类型的索引列在使用的时候没有加双引号,那么索引将失效

select * from table where name="123";	#索引有效
select * from table where name=123;		#索引失效,字符串自动转换为了Int

> 使用一些运算符

当我们在WHERE后面使用诸如:<>(不等于的意思)!=not

>当全表扫描速度比索引快的时候,MySQL会使用全表扫描。

> 注意:使用IS NULL、IS NOT NULL是会走索引的