быстрая сортировка 1 миллиарда строк по одному столбцу varchar в MYSQL

#mysql #sorting #large-data-volumes

#mysql #сортировка #большие объемы данных

Вопрос:

У меня в MYSQL хранится 1 миллиард строк, мне нужно вывести их в алфавитном порядке по столбцу a varchar, какой наиболее эффективный способ сделать это. разрешено использование других утилит Linux, таких как sort awk.

Ответ №1:

MySQL может обрабатывать миллиард строк. Эффективность зависит от 3 основных факторов: буферов, индексов и объединений.

Некоторые предложения:

Постарайтесь разместить в памяти набор данных, с которым вы работаете

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

Предпочитаю полное сканирование таблицы обращениям к индексу

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

Избегайте соединений с большими таблицами

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

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

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

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

Ответ №2:

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

Комментарии:

1. Если это недостаточно быстро, я бы попробовал какой-нибудь полнотекстовый индекс (например, lucene), чтобы выполнить сортировку, а затем получить необходимую информацию

Ответ №3:

Это зависит от того, как вы определяете efficient. Процессор / память / ввод-вывод / время / усилия по кодированию. Что важно в этом случае?

«выбрать * из порядка big_table по the_varchar_column», вероятно, является наиболее эффективным использованием ресурсов разработчика. Добавление индекса может ускорить его выполнение.