一、建立索引
1)考虑在 where 及 order by 涉及的列上建立索引
2)对于模糊查询, 建立全文索引
3)对于多主键查询,建立组合索引
二、避免陷阱
然而,一些情况下可能使索引无效:
1)在 where 子句中对字段进行表达式操作
2)在 where 子句中使用 or 来连接条件,如:
select id from t where num=10 or num=20
可以改为
select id from t where num=10
union all
select id from t where num=20
3)在 where 子句中的“=”左边进行表达式运算(可能导致无法正确使用索引)
4)在where 子句中使用参数,如:
select id from t where num=@num
可以改为(强制使用索引):
select id from t with(index(索引名)) where num=@num
5)如果该索引是组合索引,那么必须使用到该索引中的第一个字段作为查询条件, 而且尽可能让字段顺序与索引顺序一致
6)并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引
三、语句优化建议
1)慎用in 和 not in, 如:
select id from t where num in(1,2,3)
可以替代为:
select id from t where num between 1 and 3
2)用具体字段代替*
3)少用VARCHAR、 TEXT、BLOB类型
4)字段表示固定值, 使用ENUM类型代替varchar(内部使用TINYINT)
5)尽可能的使用 varchar/nvarchar 代替 char/nchar (变长字段存储空间小,节省存储空间,对于查询来说,在一个相对较小的字段内搜索效率显然要高些)
6)如果类型不限制, 用int代替varchar(字符串一个个被匹配, 而数值则一次被处理)
7)避免频繁创建和删除临时表,以减少系统表资源的消耗
8)避免频繁创建和删除临时表,以减少系统表资源的消耗
9)尽量避免大事务操作,提高系统并发能力
四、使用工具
1)任何优化都是基于数据基础的。
2)比较语句执行时间, 必要时使用Explain来跟踪查询情况