2011-03-09 93 views
1

我試圖運行此查詢:mysql的不充分利用主鍵 「SELECT * from表where(COL,COL)在」

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項,我在explain中得到rows = 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; 

我怎麼會去使這個快?這似乎是查詢計劃者失敗。

感謝,

喬恩

+0

這有點冒失,但你可以做一個有效的SELECT的'UNION',例如, '(SELECT * FROM matrix WHERE id1 = 1 AND id2 = 2)UNION(SELECT * FROM matrix WHERE id1 = 3 AND id2 = 5)' – 2011-03-09 22:38:13

+1

爲什麼'matrix'變成's1_movie'? – RichardTheKiwi 2011-03-09 22:38:32

回答

0

您可以在WHERE分成邏輯或在一起的兩個單查找零件,但將變得難以控制,如果你並不總是有兩個選擇。

0

問題是你在做IN()語句的方式。 「IN」爲「OR」語句提供了另一種語法。問題在於它強制全表掃描,不允許索引執行其工作。

相反,將其分解爲更小的SELECT語句並使用UNION聚合您的結果。這將使你的索引更相關。

我不能完全告訴你從你寫的例子的方式做什麼,但這樣的事情:

SELECT * FROM matrix WHERE col1 = var1 AND col2 = var2 
UNION 
SELECT " FROM matrix WHERE col1 = var3 AND col2 = var4 
0

樣品討論

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); 

And

explain extended 
select * from s1_movie where (id1, id2) in ((1,2), (3,5)); 

元組很漂亮是不是他們?儘管Mark的答案是猜測問題,MySQL仍然可以很好地處理元組。問題是IN子句。

+0

這仍然是緩慢的... – tpow 2011-03-09 22:43:29

+0

@cinqoTimo請擴大評論,爲什麼它「仍然緩慢」?它的執行方式與您的UNION完全相同(應該是UNION ALL btw) – RichardTheKiwi 2011-03-09 22:45:26

+0

Richard - 我的錯,我在看錯誤的查詢。你重寫了語法,這是最後一個片段,所以我認爲這是你的答案。 – tpow 2011-03-09 22:48:31

相關問題