2015-02-19 1 views
-1

Я написал запрос, который возвращает счет. Мой вопрос в том, является ли этот эффективный запрос?Эффективный запрос для подсчета

attribute_value имеет тип «longtext» и может иметь не более 5 значений. Все эти значения атрибутов исходят от ENUM (5 различных строк). Обе таблицы могут расти дольше. managed_channel может содержать миллион записей, а managed_attribute может содержать в 10 раз больше записей managed_channel

Помня об этом, будет ли этот запрос работать эффективно, или мне, возможно, придется использовать другие методы (индекс?), чтобы повысить производительность.

SELECT COUNT(*) as mo_count 
FROM managed_channel mo, managed_attribute ma 
WHERE mo.id = ma.mo_id 
AND mo.class_type = 3946 
AND ma.attribute_type = 4293 
AND ma.attribute_value IN ("ILLEGAL_MPS", "ILLEGAL_ID", "ILLEGAL_IP") 
+0

BTW, база данных mysql –

+1

Производительность такого запроса будет в значительной степени зависеть от созданных вами индексов. Невозможно судить по этому поводу, какая производительность может быть. В любом случае, если вы хотите знать производительность, измерьте ее. Все, что мы предлагаем, будет немного больше, чем образованные догадки. –

+1

Не могу сказать, не знаю количество строк, распределение данных, индексы и т. Д. – jarlh

ответ

1

Вы не хотите возвращать строки, но получаете количество на managed_channel. Вы должны использовать преимущества файлов индексов.

Таким образом, вы должны иметь индекс managed_attribute на целых ваших 3-х столбцов в порядке выдачи разрешений на внешний ключ для работы

ALTER TABLE managed_attribute ADD INDEX (attribute_type, attribute_value, mo_id); 

и на managed_channel, после цепи

ALTER TABLE managed_channel ADD INDEX(mo_id, class_type); 

Также вы следует предпочесть считать только по полю в ваших индексах:

SELECT COUNT(mo.mo_id) ... 

Отсутствие e: Я не понимаю, почему вы используете LONGTEXT для поля, которое выглядит очень коротким. Поэтому вы предпочитаете использовать тип VARCHAR или ENUM (извините, что не поняли эту часть)

+0

Ну, атрибут_значения в моем запросе не превышает 5 строк. Значение атрибута в таблице может быть любым. Я не могу контролировать, почему он определен как longtext, и я не могу его изменить. –

+0

ok, поэтому вы не сможете поместить индекс в этот столбец, но это не имеет значения – Adam