高效查询以获得计数

时间:2015-02-19 09:48:51

标签: mysql sql database-performance

我写了一个返回计数的查询。我的问题是,这是一个有效的查询吗?

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")

1 个答案:

答案 0 :(得分:1)

您不想返回行,但要计算managed_channel。您必须使用索引文件的好处。

因此,您必须在允许外键工作的订单中对整个3列上的managed_attribute建立索引

   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) ...

注意:我不明白为什么你将LONGTEXT用于看起来很短的领域。所以你宁愿采用VARCHAR或ENUM类型(抱歉没有理解那部分)