найти отличительные значения столбца varchar в очень большой таблице MYSQL - PullRequest
4 голосов
/ 11 июня 2011

Я хочу найти отличительные значения столбца varchar в очень большой таблице MYSQL (1 миллиард строк).У меня есть следующее решение:

1. select distinct(col_name) from mytable; 
2. export this column to a text file incrementally(select col_name from mytable where myid>x and myid<x+n), then use linux sort 
sort myfile.txt | uniq -u

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

Ответы [ 2 ]

1 голос
/ 11 июня 2011
  1. ...
  2. ...
  3. SELECT col_name FROM mytable GROUP BY col_name;

Даже если они возвращают один и тот же набор результатов, два запроса фактически используют разные планы выполнения, и я заметил, что GROUP BY в некоторых случаях несколько быстрее, чем DISTINCT в MySQL.

Я поддерживаю комментарий spinning_plate относительно индекса. Если у вас уже есть один, это должно быть гораздо меньше боли, чтобы получить ваш результат. Какова мощность вашего индекса?

0 голосов
/ 11 июня 2011

К сожалению, мне приходилось прибегать к подобной ерунде и раньше с MySQL. Если вы не можете просто извлечь индекс, и GROUP BY не работает быстрее (не уверен, почему это происходит, переходя к сообщению @Ben ..), вы можете попробовать сегментировать проблему, чтобы ее пакетировать.

Я бы по-прежнему работал в MySQL, скорее всего, это будет быстрее, чем все, что вы пишете сами или делаете в командной строке UNIX. Рассматривайте это так же, как материализованное представление или таблицу агрегации в DW. Один простой способ - создать пакетный скрипт, который выполнял бы SELECT DISTINCTS по небольшим диапазонам во второй таблице только с различными значениями (через MERGE или какой-либо другой механизм). Это более пакетный режим, но вы сталкиваетесь с теми же проблемами с производительностью, которые просто распределяются между заданиями. Вам придется поэкспериментировать с параметрами (размер партии). Если вы выполняете это в производственной среде, и люди ожидают получить все различные значения, как если бы они обращались напрямую к БД, было бы лучше иметь 3 таблицы: исходную, временную для текущего пакета и оперативная таблица с последними значениями и столбцом date_modified.

...