[英]Mysql not leveraging primary key in “select * from table where (col,col) in”
我正在嘗試運行此查詢:
select * from matrix where (id1, id2) in ((1,2), (3,5));
但是它非常慢。 (id1,id2)是主鍵,因此應該快速查找。 查詢計划程序是否失敗?
解釋說:
| 1 | SIMPLE | s1_movie | ALL | NULL | NULL | NULL | NULL | 48768876 | Using where |
其中48768876是其掃描的行數。
如果我只在'in'中搜索1個項目,那么我在解釋中會得到row = 1,這是正確的,因為它應該只是一個查找。
這是桌子:
CREATE TABLE s1_movie (
id1 INT NOT NULL,
id2 INT NOT NULL,
freq INT NOT NULL,
diff FLOAT NOT NULL,
PRIMARY KEY (id1, id2)
) ENGINE=INNODB;
我將如何快速做到這一點? 看來查詢規划師失敗了。
謝謝,
喬恩
您可以將WHERE分為兩個“單查詢”部分,或進行“或”運算,但是如果您不總是有兩個選擇,那將變得難以管理。
問題是您執行IN()語句的方式。 “ IN”為“ OR”語句提供了一種替代語法。 這樣做的問題是它會強制進行全表掃描,這將使您的索引無法執行其工作。
而是將其分解為較小的SELECT語句,然后使用UNION匯總結果。 這將使您的索引更相關。
我無法完全根據編寫示例的方式來判斷您在做什么,但是類似這樣:
SELECT * FROM matrix WHERE col1 = var1 AND col2 = var2
UNION
SELECT " FROM matrix WHERE col1 = var3 AND col2 = var4
討論樣本
CREATE TABLE s1_movie (
id1 INT NOT NULL,
id2 INT NOT NULL,
freq INT NOT NULL,
diff FLOAT NOT NULL,
PRIMARY KEY (id1, id2)
) ENGINE=INNODB;
insert into s1_movie select 1,2,3,4;
insert into s1_movie select 1,3,3,4;
insert into s1_movie select 1,4,3,4;
insert into s1_movie select 1,5,3,4;
insert into s1_movie select 1,6,3,4;
insert into s1_movie select 1,7,3,4;
insert into s1_movie select 1,8,3,4;
insert into s1_movie select 1,9,3,4;
insert into s1_movie select 1,0,3,4;
insert into s1_movie select 2,2,3,4;
insert into s1_movie select 2,3,3,4;
相比
explain extended
select * from s1_movie where (id1, id2) = (1,2) or (id1,id2) = (3,5);
和
explain extended
select * from s1_movie where (id1, id2) in ((1,2), (3,5));
元組很漂亮,不是嗎? 盡管Mark的答案猜測是問題所在,但MySQL可以很好地處理元組。 問題是IN子句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.