2011-04-24 19 views
3

AGE我有一個InnoDB表,只是這樣AGE [1,2,3]對1和3之間

CREATE TABLE Person (

     .... 
     age int(11) not null; 
     key (age); 
     .... 
    ) engine=InnoDB; 

我只是想知道這些查詢背後的真實的事情上age列的索引:

SELECT * FROM Person WHERE age IN [1, 2, 3]; 

SELECT * FROM Person WHERE age BETWEEN 1 AND 3; 

正如我所學到的第一個MySQL將使用在列年齡WH索引第二個它不能使用。是嗎?性能更好?

+2

使用['explain'](http://dev.mysql.com/doc/refman/5.0/en/explain.html)查找數據庫在您的特定情況下如何處理這些數據。 – Mat 2011-04-24 09:25:00

+0

另請參閱[sql:BETWEEN v1 AND v2](http://stackoverflow.com/q/1572840/112968) – knittl 2011-04-24 09:26:44

回答

7

兩個查詢都會使用索引。

查詢會翻譯成:

select * from person where age = 1 or age = 2 or age 3; 

查詢B就轉化爲

select * from person where age >= 1 and age <= 3; 

所以查詢A將做使用或3周的測試。
查詢B將使用AND進行2次測試。

查詢B更快。

一般來說,使用AND的查詢比使用OR的查詢要快。
另外查詢B正在執行更少的測試,並且因爲它正在測試一個範圍,所以它可以更容易地排除它不需要的結果。

2

我不會對我的上網本安裝了MySQL服務器,但現在堅持一個EXPLAIN聲明可能會給你你正在尋找的答案:

EXPLAIN SELECT * FROM Person WHERE age IN [1, 2, 3]; 
EXPLAIN SELECT * FROM Person WHERE age BETWEEN 1 AND 3; 
0
SELECT * FROM Person WHERE age IN [1, 2, 3]; 

相當於

SELECT * FROM Person WHERE age = 1 OR age = 2 OR age 3 

SELECT * FROM Person WHERE age BETWEEN 1 AND 3; 

相當於

SELECT * FROM Person WHERE age >= 1 AND age <= 3 

使用EXPLAIN看到實際的執行計劃的不同形式的查詢。我也會很驚訝,看到mysql不使用索引BETWEEN

EXPLAIN SELECT * FROM Person WHERE age BETWEEN 1 AND 3; 
EXPLAIN SELECT * FROM Person WHERE age IN [1,2,3]; 

應該給你一個確切的答案爲您準確的查詢

0
SELECT * FROM Person WHERE age >= 1 AND age <= 3 

快於SELECT * FROM Person WHERE age BETWEEN 1 AND 3;EXPLAIN SELECT * FROM Person WHERE age IN [1,2,3];

你可以用MySQL數據庫爲1萬分人次的紀錄嘗試。

相關問題