2012-02-19 13 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

をパフォーマンスを測定しましたか、結果は何ですか?データベースは内部的にいくつかのキャッシングを行います。したがって、同じか類似したクエリーを実行すると、キャッシュにヒットする可能性が高いため、2番目のクエリーが有利になります。 – nolt2232

+0

tblDataからのselect idの説明where 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

+0

tblDataのselect select 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

答えて

2

クエリ及びは等価であるので、これを行うべきです。クエリは全く異なるものです。クエリがこれに相当します

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

2708 <= idはブール式で、MySQLはゼロとブール値として1を使用しているため、クエリが常に1 <= 1562755185または0 <= 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 | 
+----+-------+ 
関連する問題