Ограничение использования MySQL и решение проблемы негабаритного пейджинга

MySQL

предисловие

В повседневной разработке, когда мы используем 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

Дополнительные заметки об обучении см. в личном блоге ------>Хуян тен