文本字段上的COUNT和GROUP BY似乎很慢

时间:2010-07-22 02:48:00

标签: sql mysql database query-optimization aggregate-functions

我正在构建一个MySQL数据库,其中包含有关酵母种类中DNA的特殊子串的条目。我的表看起来像这样:

+--------------+---------+------+-----+---------+-------+
| 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    |       |
+--------------+---------+------+-----+---------+-------+

大约有180万条记录。在一种类型的查询中,我想看看有多少DNA子串与每种物种和区域相关联,因此我发出此查询:

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

物种和区域列只有两个可能的条目(物种的保守/ scer,以及区域的启动子/编码),但此查询大约需要 30秒

考虑到表的大小,这种类型的查询是正常的预期时间吗?它是否很慢因为我使用的是文本字段而不是简单的整数或布尔值(我更喜欢文本字段,因为几个非CS研究人员将使用数据库)。欢迎任何其他想法和建议。

请原谅这是一个愚蠢的问题,我是一个SQL新手。

P.S。我也看过this question,但建议的解决方案似乎与我正在做的事情无关。

编辑:将这些字段转换为VARCHAR会将运行时间缩短到约2.5秒。注意我也把它与时间相似的ENUM计时。

2 个答案:

答案 0 :(得分:6)

为什么所有基于字符串的列都定义为TEXT?如果您阅读性能比较,您将看到TEXT比使用相同索引的VARCHAR列慢约3倍:http://forums.mysql.com/read.php?24,105964,105964

答案 1 :(得分:3)

如果你的领域只有2个值,你最好不要让它们成为布尔值。您还应该制作所有内容NOT NULL,除非您确实需要它NULL

另请查看ENUM type,以便更好地为列使用有限数量的人类可读值。

至于缓慢,首先要尝试在列上创建索引。对于您在此处显示的特定查询,species, region上的索引应该会产生巨大差异:

create index on mytablename (species, region);

应该这样做。