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
- SQL改寫系列九:外連線轉內連線的常見場景與錯誤SQL
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- SQL改寫系列九:外連線轉內連線的常見場景與錯誤-2SQL
- MYSQL語法:左連線、右連線、內連線、全外連線MySql
- Mysql——內外連線,事物,索引MySql索引
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- PostgreSQL優化案例之 反連線與外連線等價改寫SQL優化
- MySQL內連線查詢語句MySql
- mysql啟動不了,mysql連線不上,問題排查MySql
- MYSQL學習筆記23: 多表查詢(自連線內連線+左右外連線)MySql筆記
- Node連線MySQL並封裝其增刪查改MySql封裝
- JDBC連線mysql-8.0實現增刪改查JDBCMySql
- mysql 開放遠端連線許可權連不上MySql
- 內連線、左連線、右連線
- mysql遠端連線不上怎麼解決?MySql
- sql 內連線和外連線SQL
- MySQL 非同步驅動淺析 (三):連線池改進方案MySql非同步
- MySQL的SQL等價改寫MySql
- C連線MySQLMySql
- IDEA連線MySQLIdeaMySql
- GO 連線 MySQLGoMySql
- JDBC連線mysqlJDBCMySql
- Python 連線 MySQLPythonMySql
- python連線MySQLPythonMySql
- 騰訊雲安裝mysql遠端連線不上解決MySql
- 連線zk 報錯連線不上hbase jdbcJDBC
- 06 建立MySQL連線MySql
- JPA配置mysql連線MySql
- kettle連線本地MYSQLMySql
- MySQL連線數管理MySql
- CodeSmith 一、連線MysqlMITMySql
- Java JDBC連線MYsqlJavaJDBCMySql
- 使用pyMySql 連線mysqlMySql
- navicat連線遠端伺服器docker的mysql容器時連不上報錯伺服器DockerMySql
- ShardingSphere-proxy-5.0.0建立mysql讀寫分離的連線(六)MySql
- mysql階段04 連線工具, 連線方式, 啟動關閉mysqlMySql
- 連線mysql時提示is not allowed to connect不允許連線MySql
- python 怎麼連線 sql server,不是連線 mysqlPythonServerMySql