如果你对该文章中的内容有疑问/不解,可以点击此处链接提问
要注明问题和此文章链接地址 点击此处跳转
explain
用于事件前
explain各列意义
- table
- type(最好到最差const / eq_reg / ref / range / index / all)
- possible_keys
- key
- key_len
- ref
- rows
sql语句优化
1. 避免在where子句中进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描
如:
select id from t where num is null
解决方法:设置默认值
2. 避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
3. 避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
4. in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据
5. 避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。
6. 必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描
7. 尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描
8. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
9. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
10. 很多时候用 exists是一个好的选择,效率会提高
11. 避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来
可以进行的优化操作。
12. 充分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这时在 WHERE 子句中将连接条件完整的写上,有可能大大提高查询速度。
13. 使用视图加速查询
把表的一个子集进行排序并创建视图,有时能加速查询。它有助于避免多重排序 操作,而且在其他方面还能简化优化器的工作。
14. 能用DISTINCT的就不用GROUP BY
15. 永远为每张表设置一个主键
16. 使用ENUM而不是VARCHAR
17. 尽可能的使用NOT NULL default