2017-02-14 16 views
0

Упоминается в Alibaba Java кодекса Конвенция см https://yq.aliyun.com/articles/69327 Правило 3.2.7Почему MySQL LIMIT поиск условий с подзапросом быстрее простого поиска?

SELECT a.* FROM table1 a, (SELECT id FROM table1 WHERE condition LIMIT 100000, 20) b WHERE a.id = b.id 

гораздо быстрее, чем

SELECT * FROM table1 WHERE condition LIMIT 100000, 20 

В этой статье объясняется, что MySQL будет получать 100020 строки результата и устранить первый 100000. вместо из всего 20 строк.

Верно ли это в MySQL-запросе? Может быть ошибка или дефект?

UPDATE

предположить table1 содержит много столбцов (10+) и условие не слишком сложно (например ip LIKE '192.168.%')

+2

Это не всегда так. Это зависит от того, индексируются ли поля, которые появляются в 'condition' или нет (и как они индексируются и как они используются в' condition'). – axiac

+0

и зависит от того, сколько столбцов выбрано, проверено только сейчас :-) – auntyellow

+1

На самом деле, если 'condition' содержит столбцы, которые не содержат ни одного индекса, MySQL вынужден считывать 100020 строк из данных таблицы в обоих случаях. Теоретически эта ситуация делает первый запрос хуже (потому что он должен дважды читать данные таблицы), но на практике, скорее всего, кэширование (внутреннее кэширование MySQL и кэширование файловой системы) не позволяет ему превратиться в катастрофу. – axiac

ответ

0

Да, это правда.

1-й запрос только сканирует 100020 строк результатов для идентификатора поля, а затем сканирует полные поля по 20 строк, но второе сканирование запросов 100020 для всех полей.

+0

* ", но второе сканирование запросов 100020 для всех полей" * - это не совсем так. Это зависит от полей, которые появляются в 'condition' и указателях таблицы. – axiac

+0

@axiac: в моем заявлении я предполагаю, что условие where истинно для первых строк 100020. – algojava