MySQL下SQL性能下降原因分析及JOIN的七种写法
1.性能下降SQL慢(执行时间长,等待时间长)
a.查询语句写的烂
b.索引失效
单值索引
联合(复合)索引
c.关联查询太多join(设计缺陷或不得已的需求)
d.服务器调优及各个参数设置(缓冲、线程数等)
2.常见通用的join查询
a.SQL执行顺序
手写
SELECT
DISTINCT < select_list > FROM < left_table >
< join_type > JOIN < right_table >
ON < join_condition > WHERE< where_condition > GROUP BY< group_by_list > HAVING< having_condition > ORDER BY< order_by_condition > LIMIT < limit_number >
机读
1 FROM <left_table> 2 ON <join_condition> 3 <join_type> JOIN <right_table> 4 WHERE <where_condition> 5 GROUP BY <group_by_list> 6 HAVING <having_condition> 7 SELECT 8 DISTINCT <select_list> 9 ORDER BY <order_by_condition> 10 LIMIT <limit_number>
总结

b.Join图
c.建发SQL
d.7种JOIN
1)INNER JOIN(内连接)(AB独有)

SELECT <select_list> FROM TableA A INNER JOIN TableB B ON A.key = B.key
2)LEFT JOIN(左外连接)(A独有+AB独有)

SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key
3)RIGHT JOIN(右外连接)(B独有+AB独有)

SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key
4)(A独有)

SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key WHERE B.Key IS NULL
5)(B独有)

SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key WHERE A.Key IS NULL
6)FULL JOIN(全连接)(A+B)

SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key
# MySQL不支持这样的写法,以下是MySQL变通后的写法
SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key
UNION
SELECT
<select_list>
FROM TableA A
RIGHT JOIN TableB B
ON A.Key = B.Key
7)(全连接 + 排除交集)(A独有+B独有)

SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key WHERE A.Key IS NULL OR B.Key IS NULL
# MySQL不支持这样的写法,以下是MySQL变通后的写法
SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key
WHERE B.Key IS NULL
UNION
SELECT
<select_list>
FROM TableA A
RIGHT JOIN TableB B
ON A.Key = B.Key
WHERE A.Key IS NULL
浙公网安备 33010602011771号