MySQL字段索引无法按预期工作(innodb)

时间:2012-08-17 01:21:50

标签: mysql database database-design indexing innodb

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

如果我跑:

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

需要花费越来越长的时间,具体取决于设置为1的数量。 如果说是10,000,那么它将在1秒内快速完成。然而,如果有100万说它需要几分钟。

指数不是要让这个快吗?

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

关于为什么会这样的任何想法?是不是很糟糕?

1 个答案:

答案 0 :(得分:1)

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

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

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

有趣的是,您的经验支持这一点。 10,000行约一秒钟。行的100倍(一百万)约为100秒。您正在目睹性能的线性。

顺便说一下,如果你选择“select update”而不是“select *”,查询会更快。只能从索引中满足此查询。如果你有一个id列,你可以在(update,id)上创建索引,然后为性能做“select id”。