如果你对该文章中的内容有疑问/不解,可以点击此处链接提问
要注明问题和此文章链接地址 点击此处跳转
explain
用于事件前
explain各列意义
- table
- type(最好到最差const / eq_reg / ref / range / index / all)
- possible_keys
- key
- key_len
- ref
- rows
sql语句优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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 |