2012-02-19 46 views
0

以下查詢有什麼區別? id是主鍵mysql查詢不同,性能不同

1, select id from tbl_xxx WHERE 2708 <= id <= 1562755185; 
2, select id from tbl_xxx WHERE id> = 2708 and id <= 1562755185; 
3, select id from tbl_xxx WHERE id between 2708 and 1562755185; 

我發現性能是不同的,但我不知道爲什麼?

explain select id from tblData WHERE id >= 2708 and id <= 1562755185 ORDER BY id asc LIMIT 652000, 1000\G; 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: tblData 
     type: range 
possible_keys: PRIMARY 
      key: PRIMARY 
     key_len: 4 
      ref: NULL 
     rows: 30461948 
     Extra: Using where; Using index 

explain select id from tblData WHERE 2708 <= id <= 1562755185 ORDER BY id asc LIMIT 652000, 1000\G;   *************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: tblData 
     type: index 
possible_keys: NULL 
      key: PRIMARY 
     key_len: 4 
      ref: NULL 
     rows: 653000 
     Extra: Using where; Using index 
+0

如何你測量過性能嗎?你的結果是什麼?數據庫將在內部執行一些緩存,所以如果您背靠背運行相同或相似的查詢,第二個查詢將處於優勢,因爲它可能會觸及緩存。 – nolt2232 2012-02-19 07:03:56

+0

解釋tblData中的select id,其中id> = 2708且id <= 1562755185 ORDER BY id asc LIMIT 652000,1000 \ G; ID:1個 SELECT_TYPE:SIMPLE 表:tblData 類型:範圍 possible_keys:PRIMARY 鍵:PRIMARY key_len:4 REF:NULL 行:30461948 額外:使用其中;使用索引 – Sam 2012-02-19 07:16:31

+0

解釋從tblData中選擇id WHERE 2708 <= id <= 1562755185 ORDER BY id asc LIMIT 652000,1000 \ G; ID:1 SELECT_TYPE:SIMPLE 表:tblData 類型:指數 possible_keys:NULL 鍵:PRIMARY key_len:4 REF:NULL 行:653000 額外:使用其中;使用索引 – Sam 2012-02-19 07:19:33

回答

2

查詢和是等效所以應該執行相同的。查詢是完全不同的;查詢等效於此:

select id from tbl_xxx WHERE (2708 <= id) <= 1562755185; 

由於2708 <= id是一個布爾表達式和MySQL使用零和一爲布爾型,查詢總是比較1 <= 15627551850 <= 1562755185從而退化爲這樣:

select id from tbl_xxx; 

假設id當然不是NULL。

所以查詢是完全不同的,沒有理由期望他們執行相同的操作。

例如,我有一個表周圍踢看起來是這樣的:

mysql> select * from stars; 
+----+-------+ 
| id | stars | 
+----+-------+ 
| 1 |  1 | 
| 2 |  2 | 
| 3 |  3 | 
| 4 |  2 | 
| 5 |  1 | 
| 6 |  1 | 
| 7 |  1 | 
| 8 |  2 | 
| 9 |  1 | 
+----+-------+ 

一個between做到這一點:

mysql> select * from stars where id between 3 and 5; 
+----+-------+ 
| id | stars | 
+----+-------+ 
| 3 |  3 | 
| 4 |  2 | 
| 5 |  1 | 
+----+-------+ 

但是你a <= id <= b做到這一點:

mysql> select * from stars where 3 <= id <= 5; 
+----+-------+ 
| id | stars | 
+----+-------+ 
| 1 |  1 | 
| 2 |  2 | 
| 3 |  3 | 
| 4 |  2 | 
| 5 |  1 | 
| 6 |  1 | 
| 7 |  1 | 
| 8 |  2 | 
| 9 |  1 | 
+----+-------+