#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», вероятно, является наиболее эффективным использованием ресурсов разработчика. Добавление индекса может ускорить его выполнение.