COUNT и GROUP BY в текстовых полях кажутся медленными - PullRequest
6 голосов
/ 22 июля 2010

Я строю базу данных MySQL, которая содержит записи о специальных подстроках ДНК у видов дрожжей.Моя таблица выглядит так:

+--------------+---------+------+-----+---------+-------+
| Field        | Type    | Null | Key | Default | Extra |
+--------------+---------+------+-----+---------+-------+
| species      | text    | YES  | MUL | NULL    |       |
| region       | text    | YES  | MUL | NULL    |       |
| gene         | text    | YES  | MUL | NULL    |       |
| startPos     | int(11) | YES  |     | NULL    |       |
| repeatLength | int(11) | YES  |     | NULL    |       |
| coreLength   | int(11) | YES  |     | NULL    |       |
| sequence     | text    | YES  | MUL | NULL    |       |
+--------------+---------+------+-----+---------+-------+

Есть приблизительно 1,8 миллиона записей.В одном типе запроса я хочу увидеть, сколько ДНК-подстрок связано с каждым типом вида и региона, поэтому я задаю этот запрос:

select species, region, count(*) group by species, region;

В столбцах вида и региона есть только две возможные записи (сохранено/ scer для видов и промоутер / кодирование для региона), но этот запрос занимает около 30 секунд .

Это нормальное количество времени, которое можно ожидать для этого типа запроса, учитывая размерстол?Это медленно, потому что я использую текстовые поля вместо простых целочисленных или логических значений (я предпочитаю текстовые поля, поскольку некоторые исследователи, не относящиеся к CS, будут использовать БД).Любые другие идеи и предложения приветствуются.

Пожалуйста, извините, если это вопрос с тупой головой, я неофит SQL.

PS Я также видел этот вопрос но предложенное решение не похоже на то, что я делаю.

РЕДАКТИРОВАТЬ: Преобразование этих полей в VARCHAR сократило время выполнения до ~ 2,5 секунд.Обратите внимание, что я также рассчитал время для ENUM, которые имели схожую синхронизацию.

Ответы [ 2 ]

6 голосов
/ 22 июля 2010

Почему все ваши строковые столбцы определены как TEXT? Если вы прочитаете сравнение производительности, вы увидите, что TEXT был в ~ 3 раза медленнее, чем столбец VARCHAR, используя идентичное индексирование: http://forums.mysql.com/read.php?24,105964,105964

3 голосов
/ 22 июля 2010

Если ваши поля когда-либо будут иметь только 2 значения, лучше сделать их логическими.Вы также должны сделать все NOT NULL, если только для этого нет реальной причины, чтобы оно было NULL.

. Также посмотрите на ENUM тип для лучшего способаиспользовать конечное число удобочитаемых значений для столбца.

Что касается медлительности, первое, что нужно попробовать, - это создать индексы для ваших столбцов.Для конкретного запроса, который вы показываете здесь, индекс на species, region должен иметь огромное значение:

create index on mytablename (species, region);

должен сделать это.

...