- 尽量避免使用select *
- 规范sql语句大小写,sql是有缓存的,避免每次都要解析
- 使用exists代替in,更高效
- Mysql sql解析执行过程从右至左,基于这个规则,from后面能过滤掉更多数据的基础表放后面,where后面能过滤掉更多数据的查询条件放后面
- 查询条件中用相同类型去查询,避免类型转换
- 使用explain命令进行sql慢查询排查
- 合理使用索引
- 为合适的列添加索引(主键、唯一索引、组合索引)
- 尽量建立联合索引,也省空间成本
- 尽量使用覆盖索引
- 避免以下会使索引失效的操作索引列有null值不走索引(不一定)
- 使用is null或is not null不走索引
- 使用负向查询not、not in、not like、<>、!=、!>、!<不会使用索引
- like将%放左边不走索引
- 查询条件的数据类型做了隐式转换
- 是用in或union代替or,or两侧有非索引就不会走索引
- 尽量保持索引列干净,不在索引列上使用函数转换、运算
- 建立联合索引要遵循最左匹配原则。
- 使用比较运算或between会使联合索引从使用比较运算的下一个索引出断开
使用explain命令进行sql慢查询排查
id:select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序,id相同,执行顺序从上至下,id值越大,优先级越高,越先执行
select_type:查询类型SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION、UNION RESULT
table:正在访问的表
partitions:匹配的分区
type:访问的类型,效率从快到慢
null>system>const>eq_ref>ref>ref_or_null>index_merge>range>index>all
possible_keys:显示可能应用在这张表中的索引,一个或多个,但不一定实际使用到
key:实际使用到的索引,如果为null,则没有使用索引
key_len:表示索引中使用的字节数,可通过列计算出查询中使用的索引的长度
ref:显示索引的那一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查询索引列上的值
rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需读取的行数,这个数量越小越好
filtered:查询的表行占表的百分比
extra:包含不适合在其他列中显示但十分重要的额外信息