Порядок MySQL путем ограничения проблемы дублирования данных подкачки

задняя часть база данных MySQL Oracle

0 описание проблемы

В MySQL мы обычно используем limit для выполнения запросов перелистывания страниц.Например, limit(0,10) означает перечисление 10 фрагментов данных на первой странице, а limit(10,10) означает перечисление второй страницы. Однако, когда лимит встречает порядок, может оказаться, что при переворачивании второй страницы снова появляется запись первой страницы.

детали следующим образом:

SELECT `post_title`,`post_date` FROM post WHERE `post_status`='publish' ORDER BY view_count desc LIMIT 5,5

При использовании приведенного выше SQL-запроса очень вероятно, что появится запись, совпадающая с LIMIT 0,5. А если использовать следующий метод, дублирования не будет:

SELECT * FROM post WHERE post_status='publish' ORDER BY view_count desc LIMIT 5,5

Однако, поскольку в таблице сообщений много полей, я хочу использовать только эти два поля и не хочу также проверять содержимое post_content. Чтобы решить эту ситуацию, после ORDER BY для решения этой проблемы используются два условия сортировки, а именно:

SELECT `post_title`,`post_date` FROM post WHERE `post_status`='publish' ORDER BY view_count desc,ID asc LIMIT 5,5

Само собой разумеется, что сортировка MySQL использует идентификатор первичного ключа в качестве условия сортировки по умолчанию, то есть, если view_count равен, идентификатор первичного ключа используется в качестве условия сортировки по умолчанию, и нам не нужно добавлять идентификатор asc.Но дело в том, что когда MySQL смешивает order by и limit, возникает беспорядок сортировки..

1 Проанализируйте проблему

В MySQL версии 5.6,Когда оптимизатор сталкивается с оператором порядка по лимиту, он выполняет оптимизацию, то есть используется приоритетная очередь..

Цель использования приоритетной очереди,То есть, когда порядок индекса нельзя использовать, если вы хотите отсортировать и использовать ограничение n, вам нужно сохранить только n записей в процессе сортировки., хотя это не устраняет накладные расходы на сортировку всех записей,Но для завершения сортировки требуется лишь небольшой объем памяти в буфере сортировки..

Причина, по которой в MySQL 5.6 есть проблема с дублированием данных на второй странице,Это связано с тем, что приоритетная очередь использует метод сортировки кучей, а сортировка кучей является нестабильным методом сортировки., то есть одно и то же значение может быть отсортировано, а порядок считанных данных может быть несогласованным.

MySQL 5.5 не имеет этой оптимизации, поэтому этой проблемы не возникает.

Другими словами, MySQL 5.5 не имеет проблем, упомянутых в этой статье, и это произошло после версии 5.6.

Давайте посмотрим на порядок выполнения, когда MySQL интерпретирует язык sql:

(1)     SELECT 
(2)     DISTINCT <select_list>
(3)     FROM <left_table>
(4)     <join_type> JOIN <right_table>
(5)     ON <join_condition>
(6)     WHERE <where_condition>
(7)     GROUP BY <group_by_list>
(8)     HAVING <having_condition>
(9)     ORDER BY <order_by_condition>
(10)    LIMIT <limit_number>

Порядок выполнения такойform… where… select… order by… limit…, из-за вышеуказанной очереди приоритетов, после завершения выбора,Все записи сортируются в куче, когда выполняется упорядочивание, вперед перемещается только значение view_count. Однако из-за фактора ограничения в процессе сортировки необходимо сохранить только 5 записей.view_count не имеет индексного порядка, поэтому, когда должна отображаться вторая страница данных, mysql выберет ту, которую увидит., поэтому при одинаковых значениях сортировки первая сортировка случайная, а при втором выполнении sql результат должен быть таким же, как и при первом.

2 решения

  1. поле сортировки по индексу

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

  2. Правильно понимать нумерацию страниц

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

    Методы limit n и rownum Но нет четкого определения понятия пейджинга. Еще одним важным моментом является то, что, хотя приведенные выше решения могут облегчить проблему пользователя, в соответствии с пониманием пользователя, проблемы все же есть: например, эта таблица часто вставляется, и когда пользователь запрашивает, она находится на уровне изоляции чтения-фиксации. ., первая и вторая страницы все равно будут перекрываться.

    Итак, с нумерацией страниц всегда была эта проблема,Различные сценарии не предъявляют очень высоких требований к точности разбиения данных на страницы..

  3. Некоторые распространенные проблемы сортировки базы данных

    Проблема сортировки без порядка по

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

    Проблема с нумерацией страниц Проблема дублирования страниц

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

    Значение NULL и проблема с пустой строкой

    Разные базы данных по-разному понимают и обрабатывают значения NULL и пустые строки., такие как Oracle NULL и значения NULL не сравнимы, ни равны, ни неравны, неизвестны. Для пустых строк при вставке MySQL представляет собой пустую строку с длиной строки 0, в то время как Oracle напрямую обрабатывает значения NULL.