MySQL部分选择(性能问题)


MySQL partial select (performance issue)

我有一个超过300,000行的表(总表大小为600mb以上)。

表中的行是事件的记录,每一行都有一个时间戳(epoch)。

要对未过期事件执行查询,我必须使用WHERE epoch > currentepoch,但是执行这种查询需要5-8秒。(实际上未过期事件的数量不超过6000)

因此,对于未过期事件的简单计数,我的查询需要5-8秒。

有什么解决办法吗?我可以查询表的一部分吗?(比如忽略过期事件,让MySQL根本不通过它们)

注意:引擎是MyISAM

注2:我不能规范化表的信息是像描述等东西。

TLDR;从30万行表中计算6000行需要5-8秒,解决方案?

感谢

更新:谢谢大家。添加索引后,查询在不到半秒的时间内运行。谢谢你的帮助。

有一个东西叫做index

CREATE INDEX epoch ON tablename (epoch)

如果从所有其他答案中还不明显,您应该在epoch列上创建一个b树索引。

同样,如果你还不熟悉使用EXPLAIN来研究你的查询效率,你应该。

where子句中使用的列上应用索引始终是一个明智的主意。

如前所述,在当前poch上使用index。它允许表更快地搜索该列。

另一种解决方案是通过cronjob将事件标记为过期,用一个值更新所有过期事件,每分钟运行一次,只搜索这个值,而不是使用>

基本上应该为在WHERE子句上搜索的所有表字段创建单独的索引。组合索引(包含多个字段)应该用于更复杂的查询,但要记住索引消耗数据库空间和资源。

我不确定你能在myISAM表上创建索引——我对MySQL不是很了解,因为我更喜欢真正的数据库;-)——但是如果你不能,那么你应该把有问题的表转换成InnoDB格式,然后创建你需要的索引。

顺便说一句,你提到你的表是不可规范化的——这是不对的,每个表在某种程度上都是可规范化的,这取决于你想要投入的时间/精力。有时候,当数据变大时,这是唯一的方法,但是300000行真的不多。

祝你好运!