- 建立索引时优先考虑 where、group by 使用到的字段。
- 避免使用 select * ,尽量使用具体的返回字段。
- 减少使用 in 和 not in ,其会导致数据库引擎放弃索引进行全表扫描,可用 between 代替,若是子查询,也可用 exists 代替。
- 避免使用 or ,会导致数据库引擎放弃索引进行全表扫描。。
- 避免在字段开头使用模糊查询,会导致数据库引擎放弃索引进行全表扫描。如 %like% ->like%。
- 避免进行 null 值判断,尽量给字段添加默认值,否则会导致数据库引擎放弃索引进行全表扫描。
- 避免在 where 条件中等式的左侧进行表达式、函数操作,否则会导致数据库引擎放弃索引进行全表扫描。
如:SELECT * FROM t2 WHERE score/10 = 9;
优化可见表达式、函数操作移动到等号右侧:
SELECT * FROM t2 WHERE score = 10*9
索引失效情况总结:
- 有or必全有索引。
- 复合索引未用左列字段。
- .like以%开头。
- 需要类型转换。
- where中索引列有运算。
- where中索引列使用了函数。
- 如果mysql觉得全表扫描更快时(数据少)。
不必要使用索引的情况:
- 唯一性差。
- 频繁更新的字段不用(更新索引消耗)。
where中不用的字段。
索引使用<>时,效果一般。