MySQL In不能用內連線改寫
原來面試的時候,是作為面試題背的..
什麼MySQL In 使用Exists方式,很慢...
面試官問怎麼辦..回答用內連線改寫..
然後面試官露出滿意笑容..
一直以來都是這個劇本..
直到昨天我才發現..這個劇本原來是錯的.
實驗資料
create table song(
songid int
);
insert into song values(1),(2),(3);
create table song_category_relation(
Category varchar(10),
songid int
);
insert into song_category_relation values
('華語',1),
('華語',2),
('華語',3),
('熱門',3);
song是歌曲表
song_category_relation是歌曲和分類的對映關係表.
一個歌曲可能有多個分類.
需求.
已知一個歌曲的ID,找到這個歌曲所屬的所有分類,然後再找到所有分類下的所有歌曲.
使用In
select * from song where songid in (
select songid from song_category_relation where Category in
(select Category from song_category_relation where songid=3)
);
但是此時如果用內連線改寫..
select * from song inner join (
select songid from song_category_relation where Category in
(select Category from song_category_relation where songid=3)
) a on (a.songid=song.songid);
可以看到,兩種方式的結果並不相同..
從邏輯上看,In後面的子查詢經過了去重.
原來是透過Exists實現的.MySQL 5.6之後,採用了Semi Join最佳化.
半連線(Semi Join) 參考:
http://www.cnblogs.com/xiaotengyi/p/3908347.html
主銀你當我們傻啊
什麼MySQL In 使用Exists方式,很慢...
面試官問怎麼辦..回答用內連線改寫..
然後面試官露出滿意笑容..
一直以來都是這個劇本..
直到昨天我才發現..這個劇本原來是錯的.
實驗資料
create table song(
songid int
);
insert into song values(1),(2),(3);
create table song_category_relation(
Category varchar(10),
songid int
);
insert into song_category_relation values
('華語',1),
('華語',2),
('華語',3),
('熱門',3);
song是歌曲表
song_category_relation是歌曲和分類的對映關係表.
一個歌曲可能有多個分類.
需求.
已知一個歌曲的ID,找到這個歌曲所屬的所有分類,然後再找到所有分類下的所有歌曲.
使用In
select * from song where songid in (
select songid from song_category_relation where Category in
(select Category from song_category_relation where songid=3)
);
但是此時如果用內連線改寫..
select * from song inner join (
select songid from song_category_relation where Category in
(select Category from song_category_relation where songid=3)
) a on (a.songid=song.songid);
可以看到,兩種方式的結果並不相同..
從邏輯上看,In後面的子查詢經過了去重.
原來是透過Exists實現的.MySQL 5.6之後,採用了Semi Join最佳化.
半連線(Semi Join) 參考:
http://www.cnblogs.com/xiaotengyi/p/3908347.html
主銀你當我們傻啊
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1649928/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL 改寫系列十:半連線轉內連線SQL
- exists改為內連線
- MySQL not in巢狀查詢改寫成外連線方式MySql巢狀
- SQL改寫系列九:外連線轉內連線的常見場景與錯誤SQL
- MySQL 連線不上 急MySql
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- SQL改寫系列九:外連線轉內連線的常見場景與錯誤-2SQL
- MYSQL語法:左連線、右連線、內連線、全外連線MySql
- mysql 左連線,右連線,內連結,exists等MySql
- Mysql——內外連線,事物,索引MySql索引
- oracle sql內連線_左(右)連線_全外連線_幾種寫法OracleSQL
- PostgreSQL優化案例之 反連線與外連線等價改寫SQL優化
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- MySQL內連線查詢語句MySql
- 使用 ProxySQL 改進 MySQL SSL 的連線效能MySql
- 內連線、外連線
- 內連線、左連線、右連線
- MYSQL學習筆記23: 多表查詢(自連線內連線+左右外連線)MySql筆記
- mysql啟動不了,mysql連線不上,問題排查MySql
- 叢集資料庫主機名不能用大寫和連線符資料庫
- mysql 開放遠端連線許可權連不上MySql
- Node連線MySQL並封裝其增刪查改MySql封裝
- JDBC連線mysql-8.0實現增刪改查JDBCMySql
- 【FULL OUTER JOIN】全外連線的union all改寫方法
- mysql遠端連線不上怎麼解決?MySql
- sql 內連線和外連線SQL
- 內連線、外連線總結
- 例項解析外連線 內連線 自連線 全連線
- 改寫不走索引的SQL索引SQL
- not exists改為外連線
- 騰訊雲安裝mysql遠端連線不上解決MySql
- MySQL 非同步驅動淺析 (三):連線池改進方案MySql非同步
- SQL的四種連線:內連線 左外連線 右外連線 全連線SQL
- sql內連結,外連線SQL
- GO 連線 MySQLGoMySql
- JDBC連線mysqlJDBCMySql
- mysql 連線oracleMySqlOracle
- MySQL字串連線MySql字串