select e.emp_no,e.first_name,d.dept_no,d.from_date,d.to_date from employees e..."/>
溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Case:MySQL使用left join的時候or改寫成union可以提高效率

發(fā)布時間:2020-07-29 02:29:13 來源:網(wǎng)絡(luò) 閱讀:1778 作者:Darren_Chen 欄目:MySQL數(shù)據(jù)庫

(1)優(yōu)化前:使用or的時候,SQL執(zhí)行時間1.47s

mysql> select e.emp_no,e.first_name,d.dept_no,d.from_date,d.to_date from employees e left join dept_emp d on e.emp_no=d.emp_no where e.emp_no=32000 or d.from_date='1996-11-24';
58 rows in set (1.47 sec)

mysql> desc select e.emp_no,e.first_name,d.dept_no,d.from_date,d.to_date from employees e left join dept_emp d on e.emp_no=d.emp_no where e.emp_no=32000 or d.from_date='1996-11-24';
+----+-------------+-------+------------+------+----------------+---------+---------+--------------------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys  | key     | key_len | ref                | rows   | filtered | Extra       |
+----+-------------+-------+------------+------+----------------+---------+---------+--------------------+--------+----------+-------------+
|  1 | SIMPLE      | e     | NULL       | ALL  | PRIMARY        | NULL    | NULL    | NULL               | 299335 |   100.00 | NULL        |
|  1 | SIMPLE      | d     | NULL       | ref  | PRIMARY,emp_no | PRIMARY | 4       | employees.e.emp_no |      1 |   100.00 | Using where |
+----+-------------+-------+------------+------+----------------+---------+---------+--------------------+--------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)


(2)優(yōu)化后:相同結(jié)果集,使用union的時候,SQL執(zhí)行時間只需0.23s

mysql> select e.emp_no,e.first_name,d.dept_no,d.from_date,d.to_date from employees e left join dept_emp d on e.emp_no=d.emp_no where e.emp_no=32000 
      ->  union
      -> select e.emp_no,e.first_name,d.dept_no,d.from_date,d.to_date from employees e left join dept_emp d on e.emp_no=d.emp_no where d.from_date='1996-11-24';
58 rows in set (0.23 sec)

mysql> desc select e.emp_no,e.first_name,d.dept_no,d.from_date,d.to_date from employees e left join dept_emp d on e.emp_no=d.emp_no where e.emp_no=32000 union  select e.emp_no,e.first_name,d.dept_no,d.from_date,d.to_date from employees e left join dept_emp d on e.emp_no=d.emp_no where d.from_date='1996-11-24';
+----+--------------+------------+------------+--------+----------------+---------+---------+--------------------+--------+----------+-----------------+
| id | select_type  | table      | partitions | type   | possible_keys  | key     | key_len | ref                | rows   | filtered | Extra           |
+----+--------------+------------+------------+--------+----------------+---------+---------+--------------------+--------+----------+-----------------+
|  1 | PRIMARY      | e          | NULL       | const  | PRIMARY        | PRIMARY | 4       | const              |      1 |   100.00 | NULL            |
|  1 | PRIMARY      | d          | NULL       | ref    | PRIMARY,emp_no | PRIMARY | 4       | const              |      1 |   100.00 | NULL            |
|  2 | UNION        | d          | NULL       | ALL    | PRIMARY,emp_no | NULL    | NULL    | NULL               | 331143 |    10.00 | Using where     |
|  2 | UNION        | e          | NULL       | eq_ref | PRIMARY        | PRIMARY | 4       | employees.d.emp_no |      1 |   100.00 | NULL            |
| NULL | UNION RESULT | <union1,2> | NULL       | ALL    | NULL           | NULL    | NULL    | NULL               |   NULL |     NULL | Using temporary |
+----+--------------+------------+------------+--------+----------------+---------+---------+--------------------+--------+----------+-----------------+
5 rows in set, 1 warning (0.00 sec)


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI