2

这是我的情况。我有一个 MySQL MyISAM 表,其中包含大约 400 万条记录,总共 13,3 GB 的数据。该表包含从外部系统接收到的消息。表中的两列跟踪时间戳和布尔值是否处理消息。

使用此查询时:

SELECT MIN(timestampCB) FROM webshop_cb_onx_message

结果几乎立即出现。

但是,我需要找到未处理消息的最早时间戳,如下所示:

SELECT MIN(timestampCB ) FROM webshop_cb_onx_message WHERE handled = 0

这个查询的结果在大约 3 分钟后出现,这对于我正在编写的脚本来说太慢了。

两列都是单独索引的,而不是一起索引的。但是,考虑到已经存在的数据量,向表中添加索引将花费非常长的时间。

我的问题是否源于两个列都被单独索引的事实,如果是这样,除了添加另一个索引之外,是否有人可以解决我的问题?

4

1 回答 1

2

通常建议,如果索引的选择性超过 20%,则全表扫描优于索引访问。这意味着您的已处理索引很可能实际上不会导致使用该索引,而是在给定选择性的情况下进行全表扫描。

复合索引handled, timestampCB实际上可能会在给定复合索引的情况下提高性能,即使选择性不是很好,MySQL 很可能仍然会使用它——即使它没有,你也可以强制它使用

于 2013-03-19T20:49:26.877 回答