<1>全值匹配我最爱
建立索引提高效率 CREATE INDEX 索引名字 ON 表名(表字段,表字段,表字段,......)
<2>最佳左前缀法则
如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 AND emp.name = 'abcd'
虽然只是使用了一部分但是效率还是提高了。
完全没有使用上索引
结论:过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。
<3>不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
这两条sql哪种写法更好
SELECT SQL_NO_CACHE * FROM emp WHERE emp.name LIKE 'abc%'
SELECT SQL_NO_CACHE * FROM emp WHERE LEFT(emp.name,3) = 'abc'
<4>存储引擎不能使用索引中范围条件右边的列,可以将范围索引字段放置到索引中的最右位置
如果系统经常出现的sql如下:
SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 AND emp.deptId>20 AND emp.name = 'abc' ;
那么索引 idx_age_deptid_name这个索引还能正常使用么?
如果这种sql 出现较多。应该建立: create index idx_age_name_deptid on emp(age,name,deptid)
效果:
<5>mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描
<6>is not null 也无法使用索引,但是is null是可以使用索引的
<7>like以通配符开头('%abc...')mysql索引失效会变成全表扫描的操作
<8>字符串不加单引号索引失效