0

我有 3000 万条记录,一个字段(已更新)是带有索引的 tinyint(1)。

如果我运行:

SELECT * FROM  `table` WHERE `updated` = 1

这将花费越来越长的时间,具体取决于设置为 1 的数量。如果是 10,000,它将非常快,大约 1 秒。但是,如果说 100 万,则需要几分钟。

索引不是应该让这个速度变快吗?

当我在一个相似的非索引字段上运行相同的查询时,它只是 int(1),它的执行与索引字段相同。

关于为什么会这样的任何想法?tinyint 不好吗?

4

1 回答 1

1

通常,将二进制列用于索引并不是一个好主意。在某些情况下它是可以的,但这通常是可疑的。

索引的主要目的是减少查询的 I/O。表达查询的方式,它需要原始数据(以满足“select *”)和索引(用于 where 子句)。

所以,数据库引擎会遍历索引。每次找到匹配的记录时,都会将该页面加入成员。你有一个 I/O 命中。因为你的表太大了,页面可能还没有看到,所以有一个真正的 I/O 命中。

有趣的是,您的经验支持这一点。10,000 行大约是一秒。行数的 100 倍(一百万)大约是 100 秒。您正在见证性能的线性。

顺便说一句,如果您执行“select update”而不是“select *”,查询会更快。这个查询只能从索引中得到满足。如果您有一个 id 列,您可以在 (update, id) 上创建索引,然后执行“选择 id”以提高性能。

于 2012-08-17T01:29:25.643 回答