Mysql-性能优化

1、参数是子查询时,使用EXISTS代替IN

原因:

  • 如果链接列(如id)上建立了索引,那么查询时只需要查索引就可以了,而不用查实际的表
  • 使用EXISTS只要查询到一行数据满足条件便会终止查询,不用像IN扫描全表

2、UNION ALL性能高于UNION

原因:UNION等集合运算符会自动排序,ALL可不用去重,也就不需要排序

3、使用EXISTS代替DISTINCT
原因:DISTINCT也会排序,除此之外GROUP BY、ORDER BY、聚合函数、集合运算符、窗口函数都会排序

4、尽量不要使用HAVING

原因:如果有GROUP BY,WHERE可以先筛选一遍,并且WHERE可以使用索引,但HAVING是针对聚合后生成的视图进行筛选,很多时候聚合后的视图都没有继承原表的索引结构

5、在GROUP BY子、ORDER BY子句和极值函数的字段使用索引

6、以下几种不会用到索引:

  • 在索引字段上进行运算,例如 WHERE col * 1.1>100,可改写为col>100/1.1,条件表达式左侧最好是原始字段而不进行运算
  • 使用 IS NULL 谓词,因为索引字段不存在NULL
  • 使用否定形式,例如<>   !=   NOT
  • 使用OR
  • 使用联合索引时,列的顺序错误
  • 使用LIKE进行后方一致或中间一致的匹配,只有前方一致匹配可以使用索引
  • 进行默认的类型转换,最好使用显示类型转换,例如CAST(10, AS CHAR(2))

7、对聚合结果进行筛选条件时使用HAVING,不需要套一层再做筛选

8、对多个字段使用IN谓词时,将它们汇总到一处

9、先连接再聚合

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值