Closed AdrianHu99 closed 5 years ago
*禁止使用SELECT 必须使用SELECT <字段列表> 查询**
原因:
· 消耗更多的CPU和IO以网络带宽资源
· 无法使用覆盖索引
· 可减少表结构变更带来的影响
子查询IN性能差的原因:
· 子查询的结果集无法使用索引,通常子查询的结果集会被存储到临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,所以查询性能 会受到一定的影响;
· 特别是对于返回结果集比较大的子查询,其对查询性能的影响也就越大;
· 由于子查询会产生大量的临时表也没有索引,所以会消耗过多的CPU和IO资源,产生大量的慢查询。
对应同一列进行or判断时,使用in代替or
in的值不要超过500个in操作可以更有效的利用索引,or大多数情况下很少能利用到索引。
在明显不会有重复值时使用UNION ALL而不是UNION
· UNION会把两个结果集的所有数据放到临时表中后再进行去重操作
· UNION ALL不会再对结果集进行去重操作
一个SQL只能利用到复合索引中的一列进行范围查询
如:有 a,b,c列的联合索引,在查询条件中有a列的范围查询,则在b,c列上的索引将不会被用到,在定义联合索引时,如果a列要用到范围查找的话,就要把a列放到联合索引的右侧。
使用left join或 not exists来优化not in操作
因为not in 也通常会使用索引失效。
避免数据类型的隐式转换
隐式转换会导致索引失效。如:select name,phone from customer where id = '111';
常见索引列建议 · 出现在SELECT、UPDATE、DELETE语句的WHERE从句中的列
· 包含在ORDER BY、GROUP BY、DISTINCT中的字段
并不要将符合1和2中的字段的列都建立一个索引,通常将1、2中的字段建立联合索引效果更好
· 多表join的关联列
https://mp.weixin.qq.com/s/IG_4XQwCzR0nJoqpZ7N25Q