我正在构建一个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计时。
答案 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);
应该这样做。