18.小表驱动大表

  • 查询优化
  • 慢查询日志
  • 指量数据脚本
  • Show Profile
  • 全局查询日志

分析

  • 1.观察,至少跑一天,看看生产环境的慢SQL情况。
  • 2.开启慢查询日志,设置阈值,比如超过300毫秒的就是慢SQL,并将它抓取出来
  • 3.explain+慢SQL分析
  • 4.show profile
  • 4.运维经理 or DBA 进行SQL数据库服务器的参数调优。

总结

  • 1.慢查询的开启并捕获
  • 2.explain + 慢SQL分析
  • 3.show profile查询的SQL在MySQL服务器里面的执行细节和生命周期情况
  • 4.SQL数据库服务器的参数调优

exists 和 in

当B表的数据集必须小于A表的数据集时,用in优于exists

select * from A where id in(select id from B)

当A表的数据集小于B表的数据集时,用exists优于in

select * from A where exists (select 1 from B where B.id = A.id)

注意:A表与B表的字段应建立索引。

EXISTS

SELECT ... FROM table WHERE EXISTS(subquery)

该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决这【下主查询的数据结果是否得以保留

提示

  • 1.EXISTS(subquery)只返回TRUE或FALSE,因此子查询中的 SELECT * 也可以是SELECT 1或其它,官方说法是实际执行时会忽略SELECT 清单,因此没有区别
  • 2.EXISTS子查询的实际执行过程可能经过了优化,而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以确定是否有效率问题。
  • 3.EXISTS子查询往往也可以用条件表达式,其他子查询或者JOIN替代,何种最优需具体问题具体分析。