Знаете ли вы, что у MySQL Limit есть проблемы с производительностью?

MySQL
Знаете ли вы, что у MySQL Limit есть проблемы с производительностью?

Запрос на разбиение на страницы MySQL обычно выполняетсяlimitреализовать.

MySQLlimitОсновное использование простое.limitПринимает 1 или 2 целочисленных параметра, если это 2 параметра, первый — это смещение указанной первой возвращаемой строки записи, а второй — максимальное количество возвращаемых строк записи. Смещение начальной строки записи равно 0.

Для совместимости с PostgreSQL,limitтакже поддерживаетlimit # offset #.

проблема:

Для небольших смещений используйте непосредственноlimitС запросами проблем нет, но чем больше объем данных, тем больше страниц выгружается,limitЧем больше смещение оператора, тем медленнее будет скорость.

Оптимизационное мышление:

Избегайте сканирования слишком большого количества записей при большом объеме данных.

решать:

Метод пейджинга подзапроса или метод пейджинга JOIN.

Эффективность пейджинга JOIN и пейджинга подзапросов в основном находится на одном уровне, и затраты времени в основном одинаковы.

Вот пример. Как правило, первичный ключ MySQL представляет собой числовой тип с автоинкрементом, и в этом случае для оптимизации можно использовать следующие методы.

Возьмем в качестве примера таблицу из 800 000 фрагментов данных в реальной производственной среде, чтобы сравнить время запроса до и после оптимизации:


-- 传统limit,文件扫描
[SQL]SELECT * FROM tableName ORDER BY id LIMIT 500000,2;
受影响的行: 0
时间: 5.371s

-- 子查询方式,索引扫描
[SQL]
SELECT * FROM tableName
WHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 500000 , 1)
LIMIT 2;
受影响的行: 0
时间: 0.274s

-- JOIN分页方式
[SQL]
SELECT *
FROM tableName AS t1
JOIN (SELECT id FROM tableName ORDER BY id desc LIMIT 500000, 1) AS t2
WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT 2;
受影响的行: 0
时间: 0.278s

Видно, что оптимизированная производительность улучшилась почти в 20 раз.

Принцип оптимизации:

Подзапросы выполняются по индексу, в то время как обычные запросы выполняются по файлу данных.Вообще говоря, индексный файл намного меньше, чем файл данных, поэтому работать с ним будет более эффективно. Потому что, чтобы вынуть все содержимое поля, первое нужно охватить большое количество блоков данных и вынуть, а второе в основном делается напрямуюПосле позиционирования в соответствии с полем индекса извлекается соответствующий контент., эффективность, естественно, значительно повышается.

Поэтому даlimitоптимизация, не используя напрямуюlimit, но сначала получить идентификатор смещения, а затем использовать его напрямуюlimitразмер для получения данных.

В реальной работе над проектом аналогичный шаблон стратегии можно использовать для управления разбиением на страницы. Например, если имеется 100 единиц данных на странице, и считается, что они находятся в пределах 100 страниц, используется самый простой метод разбиения по страницам. больше 100, используется метод пейджинга подзапросов.

Статьи по Теме


Wechat-westcall