簡體   English   中英

MySQL在“選擇*從表中的(col,col)在”中沒有利用主鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM