环境:mysql5.7.13 innodb引擎
1.select * from test where name=‘Allen’;
如果name字段建立了索引,一般会走该索引,但是如果name字段的值分布不均匀,比如Allen这个名字占了大部分,则很有可能会放弃走name索引,直接进行全表扫描,因为如果继续走name索引的话,就要进行大量的回表查询,这样的话对比全表扫描就没有了优势。
2.select * from test where name=123;
这种情况下不会走name索引,因为name字段的类型是字符串,where条件中的123没加引号,所以是数字,查询时要隐式转换成字符串。只要发生这种隐式转换的,都不会走索引。
3.select * from test where name>‘Allen’;
可以在name索引上做范围查询,但是否走索引还是要看优化器的分析,如果符合条件的数据行太多,则会直接进行全表扫描。
4.select * from test where name!=‘Allen’;
但从这条语句上看,的确很难去走索引。但是如果name不等于Allen的行实在太多,优化器可以通过改变查询条件从而走索引查询,比如改为查询name小于’Allen’和name大于’Allen’的行。
5.select * from test where name is null;
当符合条件的行数少时走索引。
6.select * from test where name i