2011-03-31 32 views
1

我有一個表table1。它有3列:表結構

id, int, auto incrementing, primary key 
id2,int 
description,varchar(255) 

設置的唯一鍵是id作爲主鍵。

由此我運行此查詢:

SELECT * FROM table1 WHERE id2=1 OR 5 OR 2 LIMIT 250; 

我沒有設置多個id作爲primary key以外的任何其他鍵並有用於ID2值(所有整數)和三個約20的可能性爲每個隨機選擇查詢。

該表格目前是MYISAM。

我能做些什麼使上面的查詢更快?

我應該在table1上設置哪些其他鍵?

將id和id2組合在一起會使它更快嗎?

+0

不要混淆'鑰匙'和'索引'!鍵只能設置,如果列數據是唯一的 – user492238 2011-03-31 14:59:48

回答

1

您應該table1 (id2)創建索引,並重新編寫查詢,以便可以選擇只抱着你提供值的記錄:

SELECT * 
FROM table1 
WHERE id2 IN (1, 2, 5) 
LIMIT 250 

因爲它是現在,查詢是這樣的:

SELECT * 
FROM table1 
WHERE (id2 = 1) OR 2 OR 5 
LIMIT 250 

,與25被計算爲布爾TRUE

這會導致返回所有記錄(在限制範圍內),而不是其實際值。

0

你應該在id2上設置一個索引。 id的索引並不重要,除非你特意查詢,並且id,id2的多列索引根本沒有用處。另外,你可以改變你的查詢:

SELECT * FROM table1 WHERE id2 in (1,2,5) LIMIT 250; 
+0

謝謝,我還應該設置ID作爲主索引? – David19801 2011-03-31 14:57:20

+1

是的,這對每一行都是獨一無二的,應該仍然是主鍵。 – Kelly 2011-03-31 14:58:25

2

看來你已經暗示了答案。由於您在語句的where子句中對id2列進行搜索,因此該列上的索引將加速這些問題。

1

您可以將id2轉換爲索引。

ALTER TABLE `table1` ADD INDEX ( `id2`); 

您也可以查詢好一點通過重組有點

SELECT * FROM `table1` WHERE `id2` IN (1,2,5) LIMIT 250; 
1

您所查詢的是錯的,你會檢索整個數據集,然後將其限制在250個搜索結果。原因是錯誤的WHERE子句。

WHERE id2 = 1與該特定行匹配,但是「OR 5 OR 2」與ID列不匹配,他們將簡單評估爲true。所以你選擇了一切。

你可以做的是使用

SELECT * FROM table1 WHERE id2 = 1 OR id2 = 5 OR id = 2 

OR

SELECT * FROM table1 WHERE id2 IN(1, 5, 2) 

而且,即使壽ID2具有選擇性低,你應該建立索引。原因是:你有描述列,這使得數據文件大於可能的索引文件。完全掃描索引文件比數據文件更快。你會得到一點好處,但這會是一個好處。