MySQL запрос отличается, производительность отличается - PullRequest
0 голосов
/ 19 февраля 2012

следующий запрос В чем разница? id - это первичный ключ

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

1 Ответ

2 голосов
/ 19 февраля 2012

Запросы 2 и 3 эквивалентны, поэтому они должны выполнять то же самое. Запрос 1 - это нечто совершенно другое; запрос 1 эквивалентен этому:

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

Поскольку 2708 <= id является логическим выражением, а MySQL использует ноль и единицу в качестве логического значения, ваш запрос всегда сравнивает 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 |
+----+-------+

A 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 |
+----+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...