一 sql 优化分析过程
1 观察,至少跑1天,看看生产的慢 sql 情况。
2 开启慢查询日志,设置阀值,比如超过5秒钟就是慢sql,并将它抓取出来。
3 expiain + 慢 sql 分析。
4 show profile
5 运维经理 or DBA,进行 sql 数据库服务器的参数调优。
二 小结
1 慢查询的开启并捕获
2 explain + 慢sql分析
3 show profile 查询 sql 在 mysql 服务器里面的执行细节和生命周期情况
4 sql 数据库服务器的参数调优
三 小表驱动大表
类似嵌套循环,外层循环是小循环,内层循环是大循环。
优化元组:小的数据集驱动大的数据集
四 案例
这个案例中,为了便于理解,可以将 A 表想象成员工表,B 表想象成部门表。
五 关于 exists 的理解
select ... from table where exists (subquery)
该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(True 或 False)来决定主查询的数据结果是否得以保留。
提示:
1 exists(subquery)只返回 true 或 false,因此子查询中的 select * 也可以理解为 select 1 或 select ‘X‘,官方说明是实际执行会忽略 select 清单,因此没有区别。
2 exists 子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担心效率问题,可进行实际检验以确定是否有效率问题。
3 exists 子查询往往也可以用条件表达式、其他子查询或者 join 来替代,哪种最优需要具体问题,具体分析
六 实战
# 大表
mysql> select * from tbl_emp;
+----+------+--------+
| id | name | deptId |
+----+------+--------+
| 1 | z3 | 1 |
| 2 | z4 | 1 |
| 3 | z5 | 1 |
| 4 | w5 | 2 |
| 5 | w6 | 2 |
| 6 | s7 | 3 |
| 7 | s8 | 4 |
| 8 | s9 | 51 |
+----+------+--------+
8 rows in set (0.00 sec)
# 小表
mysql> select * from tbl_dept;
+----+----------+--------+
| id | deptName | locAdd |
+----+----------+--------+
| 1 | RD | 11 |
| 2 | HR | 12 |
| 3 | MK | 13 |
| 4 | MIS | 14 |
| 5 | FD | 15 |
+----+----------+--------+
5 rows in set (0.00 sec)
# 小表驱动大表
mysql> select * from tbl_emp e where e.deptId in (select id from tbl_dept);
+----+------+--------+
| id | name | deptId |
+----+------+--------+
| 1 | z3 | 1 |
| 2 | z4 | 1 |
| 3 | z5 | 1 |
| 4 | w5 | 2 |
| 5 | w6 | 2 |
| 6 | s7 | 3 |
| 7 | s8 | 4 |
+----+------+--------+
7 rows in set (0.00 sec)
# 大表驱动小表,功能同上,但性能没有上面这句优。
mysql> select * from tbl_emp e where exists (select 1 from tbl_dept d where d.id=e.deptId);
+----+------+--------+
| id | name | deptId |
+----+------+--------+
| 1 | z3 | 1 |
| 2 | z4 | 1 |
| 3 | z5 | 1 |
| 4 | w5 | 2 |
| 5 | w6 | 2 |
| 6 | s7 | 3 |
| 7 | s8 | 4 |
+----+------+--------+
7 rows in set (0.00 sec)
# 这里 1 可以换成其他常量,例如 'X'
mysql> select * from tbl_emp e where exists (select 'X' from tbl_dept d where d.id=e.deptId);
+----+------+--------+
| id | name | deptId |
+----+------+--------+
| 1 | z3 | 1 |
| 2 | z4 | 1 |
| 3 | z5 | 1 |
| 4 | w5 | 2 |
| 5 | w6 | 2 |
| 6 | s7 | 3 |
| 7 | s8 | 4 |
+----+------+--------+
7 rows in set (0.00 sec)