mysql出现索引失效


1.在查询的时候谨慎使用in 语句,如果达到百万级时采用exists 来替换in 如果是连续的1,2,3可以采用between and 进行替换 2.在进行模糊查询的时候要注意百分号开始时索引失效 3.当sql 中采用or 进行连接的时候会索引失效,我们如果真要使用就采用联合索引或者在连接的字段上都要使用上索引才行。 4,在使用sql 语句的时候尽量不要使用!= 或者< > 5,进行sql 优化的时候,尽量避免进行全表扫描,首先考虑在where 及 order by 进行建立索引 6.尽量避免where 字句字段进行null 值进行判断,否则导致引擎放弃使用索引进行全表扫描 7、如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫 select id from t where num=@num 可以改为强制查询使用索引: select id from t with(index(索引名)) where num=@num select id from t with(index(索引名)) where num=@num 8、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如: select id from t where num/2=100 应改为: select id from t where num=100*2 9、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如: select id from t where substring(name,1,3)=’abc’–name以abc开头的id select id from t where datediff(day,createdate,’2005-11-30′)=0–’2005-11-30′生成的id 应改为: select id from t where name like ‘abc%’ select id from t where createdate>=’2005-11-30′ and createdate<’2005-12-1′   10、不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。 11、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使 用,并且应尽可能的让字段顺序与索引顺序相一致。     索引的使用: 1.如果是百分号开头的"%"将不会使用索引 2.组合索引是只有使用最前前缀的才会使用索引 3.使用or关键字时只有前后都有索引,才会使用到索引 4.优化字查询 子查询会在内存中建立临时表,数据越大越影响其速度