Почему сценарий пейджинга (лимит, смещение) работает медленно

база данных

Начните с вопроса

Пять лет назад, когда я был в tx, я обнаружил, что в сценарии подкачки скорость запросов mysql была очень низкой. Когда объем данных составляет всего 10 Вт, для выбора xx с одной машины требуется около 2 или 3 секунд. Я спросил своего инструктора, почему, и он ответил: «В сценарии индекса, какова временная сложность получения n-го по величине числа в mysql?»

Поиск ответов

Подтвердите сцену

Предположим, что есть индекс состояния. выберите * из таблицы, где статус = xx limit 10 offset 10000. будет очень медленным. В случае небольшого количества данных происходит задержка в несколько секунд.

Сяобай ответы

Я угадал лог(N) и хотел найти узел, который не лог(N). Естественно, мой руководитель позволил мне провести собственное исследование.

Этот этап занял 10 минут.

Продолжить ответы

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

Когда я увидел эту картину, я просветлел. 100-е по величине дерево можно найти со сложностью O (n) непосредственно через связанный список, состоящий из листовых узлов. Но даже o(n), это не ужасно медленно, есть причина.

На этом этапе я в основном искал информацию в Интернете и пользовался ею с перерывами в течение 10 дней.

систематическое обучение

Здесь рекомендуются две книги, одна «InnoDB Storage Engine Inside MySQL Technology», благодаря которой вы сможете глубже понять механизм реализации InnoDB, такой как mvcc, реализация индекса и файловое хранилище.

Вторая книга - «Высокая производительность MySQL». Эта книга начинается с уровня использования, но он разговаривает в глубине и упоминает много дизайнерских идей.

Совмещая две книги и осмысливая их снова и снова, mysql едва в состоянии войти в комнату.

Здесь есть два ключевых понятия:

  • Кластеризованный индекс: содержит индекс первичного ключа и соответствующие фактические данные, а конечный узел индекса является узлом данных.
  • Вспомогательный индекс: его можно понимать как вторичный узел, а его конечный узел по-прежнему является узлом индекса, включая идентификатор первичного ключа.

Даже если первые 10 000 будут выброшены, MySQL будет проверять данные по кластерному индексу через id первичного ключа на вторичном индексе, это 10 000 случайных IO, и естественно потихоньку станет хаски. Здесь могут возникнуть вопросы, почему такое поведение, это яма оптимизатора mysql, и она не решена до сих пор.

До этого момента я, наверное, понимал причину медлительности.

Как с этим бороться

«Высокая производительность MySQL» упоминает два варианта

Вариант первый

В соответствии с фактическими потребностями бизнеса, посмотрите, можно ли заменить его функциями следующей страницы и предыдущей страницы, особенно на стороне ios и android, предыдущий вид полной подкачки не распространен. Вот способ заменить limit, offset на > вспомогательный индекс (т.е. условие поиска) id. Когда идентификатор вызывается снова, его необходимо вернуть во внешний интерфейс.

Вариант 2

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

Идея заключается в следующем: выберите xxx,xxx из in (выберите идентификатор из таблицы, где second_index = xxx limit 10 offset 10000) Это предложение означает, что сначала из условного запроса найдите значение уникального идентификатора базы данных, соответствующее данным, поскольку первичный ключ существует на вспомогательном индексе, поэтому нет необходимости возвращаться на диск кластеризованного индекса, чтобы вытащить . Затем через эти 10 идентификаторов первичных ключей, которые были ограничены, запросите кластеризованный индекс. Это будет только случайным образом десять раз. В случае, когда бизнесу действительно необходимо использовать пейджинг, использование этой схемы может значительно повысить производительность. Требования к производительности обычно выполняются.

напиши в конце

От небольшой проблемы, чтобы копнуть глубже, это кратчайший путь к совершенствованию технологии.