建立一张staffs表,字段id,name,age,pos。建立name、age、pos符合索引。
全值匹配
索引建立是按照name、age、pos顺序建立,全值匹配表示按顺序匹配查询。可以部分匹配。
sql查询的访问形式都是ref,且参照查询都是常数。
最佳左前缀法则
如果索引了多列,sql查询时要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。否则索引会失效。
注意:
(1) and 忽略左右关系。既即使没有按顺序 由于优化器的存在,会自动优化。
(2)当使用覆盖索引的方式时,(select name/age/id from staffs where age=10 (后面没有其他没有索引的字段条件)),即使不是以 name 开头,也会使用 idx_nameAge 索引。
不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
存储引擎不能使用索引中范围条件右边的列
注意:范围 若有索引则能使用到索引,范围条件右边的索引会失效(范围条件右边与范围条件使用的同一个组合索引,右边的才会失效。若是不同索引则不会失效)
尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
使用不等于(!=或者<>)的时候无法使用索引导致全表扫描
is null 和 is not null也无法使用索引
like一通配符开头(’%abc’)索引失效变成全表扫描
注意:%加在后面,索引不失效,但是查询不到数据或者没有意义。
案例:实际开发中,必须用 ‘%abc%’,怎么解决索引失效问题?
解决:使用覆盖索引。
未创建索引:
创建索引后:
CREATE INDEX idx_user_nameAge ON tbl_user(NAME,age);
字符串不加单引号索引失效
mysql会隐式的将整形转换为所需的字符型。