предисловие
В повседневной разработке, когда мы используем mysql для реализации функции подкачки, мы всегда используем синтаксис пределов mysql, но то, как его использовать, очень специфично, поэтому я подытожу его сегодня.
синтаксис ограничения
Синтаксис limit поддерживает два параметра:offsetиlimit, первое представляет смещение, а второе представляет данные первого предела.
Например:
## 返回符合条件的前10条语句
select * from user limit 10
## 返回符合条件的第11-20条数据
select * from user limit 10,20
Из вышеизложенного также видно, чтоlimit n
Эквивалентноlimit 0,n
.
анализ производительности
При реальном использовании мы обнаружим, что на некоторых страницах после пейджинга загрузка будет медленнее, то есть:
select * from user limit 1000000,10
Выполнение оператора медленное, поэтому давайте сначала проверим его.
Первый — получить 100 кусков данных при маленьком смещении (общее количество данных около 200), затем постепенно увеличивать смещение.
select * from user limit 0,100 ---------耗时0.03s
select * from user limit 10000,100 ---------耗时0.05s
select * from user limit 100000,100 ---------耗时0.13s
select * from user limit 500000,100 ---------耗时0.23s
select * from user limit 1000000,100 ---------耗时0.50s
select * from user limit 1800000,100 ---------耗时0.98s
Видно, что по мере увеличения смещения производительность становится все хуже и хуже.
почему это? потому чтоlimit 10000,10
На самом деле синтаксис таков, что mysql находит первые 10010 фрагментов данных, а затем отбрасывает первые 10000 строк.Этот шаг на самом деле напрасный.
оптимизация
оптимизировать с идентификатором
Сначала найдите самый большой идентификатор последней подкачки, а затем используйте индекс идентификатора для запроса, аналогичноselect * from user where id>1000000 limit 100
.
Эта эффективность очень высока, потому что есть индекс по первичному ключу, но у этого есть недостаток, заключающийся в том, что идентификатор должен быть непрерывным, и запрос не может иметь оператор where, потому что оператор where вызовет фильтрацию данных.
Оптимизация с покрывающими индексами
Когда запрос mysql полностью попадает в индекс, он называется покрывающим индексом, что очень быстро, потому что запросу нужно только выполнить поиск по индексу, а затем его можно вернуть напрямую, не возвращаясь к таблице данных для получения данных. Поэтому мы можем сначала найти индекс ID, а потом получить данные по ID.
select * from (select id from job limit 1000000,100) a left join job b on a.id = b.id;
Это занимает 0,2 секунды.
Суммировать
Действительно сложно использовать mysql для разбиения на страницы большого объема данных, но есть также некоторые методы оптимизации, которые необходимо протестировать в сочетании с бизнес-сценариями.
Когда пользователь перелистывает 10 000 страниц, почему бы нам просто не вернуться на пустое место, неужели это так скучно...
Заканчивать.
ChangeLog
2019-05-25 Завершено** Все вышесказанное является личным мнением, если есть какие-либо ошибки, пожалуйста, исправьте меня в области комментариев. **
Добро пожаловать на перепечатку, пожалуйста, подпишите и сохраните исходную ссылку.
Контактный адрес электронной почты: huyanshi2580@gmail.com
Дополнительные заметки об обучении см. в личном блоге ------>Хуян тен