AdrianHu99 / NOTES

0 stars 0 forks source link

一份非常完整的 MySQL 规范 #33

Closed AdrianHu99 closed 5 years ago

AdrianHu99 commented 5 years ago

https://mp.weixin.qq.com/s/IG_4XQwCzR0nJoqpZ7N25Q

AdrianHu99 commented 5 years ago

*禁止使用SELECT 必须使用SELECT <字段列表> 查询**

原因:

· 消耗更多的CPU和IO以网络带宽资源

· 无法使用覆盖索引

· 可减少表结构变更带来的影响

AdrianHu99 commented 5 years ago

子查询IN性能差的原因:

· 子查询的结果集无法使用索引,通常子查询的结果集会被存储到临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,所以查询性能 会受到一定的影响;

· 特别是对于返回结果集比较大的子查询,其对查询性能的影响也就越大;

· 由于子查询会产生大量的临时表也没有索引,所以会消耗过多的CPU和IO资源,产生大量的慢查询。

AdrianHu99 commented 5 years ago

对应同一列进行or判断时,使用in代替or

in的值不要超过500个in操作可以更有效的利用索引,or大多数情况下很少能利用到索引。

AdrianHu99 commented 5 years ago

在明显不会有重复值时使用UNION ALL而不是UNION

· UNION会把两个结果集的所有数据放到临时表中后再进行去重操作

· UNION ALL不会再对结果集进行去重操作

AdrianHu99 commented 5 years ago

一个SQL只能利用到复合索引中的一列进行范围查询

如:有 a,b,c列的联合索引,在查询条件中有a列的范围查询,则在b,c列上的索引将不会被用到,在定义联合索引时,如果a列要用到范围查找的话,就要把a列放到联合索引的右侧。

使用left join或 not exists来优化not in操作

因为not in 也通常会使用索引失效。

AdrianHu99 commented 5 years ago

避免数据类型的隐式转换

隐式转换会导致索引失效。如:select name,phone from customer where id = '111';

AdrianHu99 commented 5 years ago

常见索引列建议 · 出现在SELECT、UPDATE、DELETE语句的WHERE从句中的列

· 包含在ORDER BY、GROUP BY、DISTINCT中的字段

并不要将符合1和2中的字段的列都建立一个索引,通常将1、2中的字段建立联合索引效果更好

· 多表join的关联列