MySQL字段上的索引未按预期工作(innodb)
我有3000万条记录,其中一个字段(已更新)是一个带有索引的tinyint(1) 如果我跑步:MySQL字段上的索引未按预期工作(innodb),mysql,database,database-design,indexing,innodb,Mysql,Database,Database Design,Indexing,Innodb,我有3000万条记录,其中一个字段(已更新)是一个带有索引的tinyint(1) 如果我跑步: SELECT * FROM `table` WHERE `updated` = 1 这将需要越来越长的时间,这取决于将多少设置为1。 如果它是10000,它将相当快,大约1秒。然而,如果有100万美元,则需要几分钟 难道索引不应该使这一速度加快吗 当我在一个非索引字段上运行相同的查询时,该字段仅与int(1)相似,它执行的操作与索引字段相同 你知道为什么会这样吗?tinyint不好吗?一般来说,使
SELECT * FROM `table` WHERE `updated` = 1
这将需要越来越长的时间,这取决于将多少设置为1。
如果它是10000,它将相当快,大约1秒。然而,如果有100万美元,则需要几分钟
难道索引不应该使这一速度加快吗
当我在一个非索引字段上运行相同的查询时,该字段仅与int(1)相似,它执行的操作与索引字段相同
你知道为什么会这样吗?tinyint不好吗?一般来说,使用二进制列作为索引不是一个好主意。在某些情况下,这是可以的,但这通常是可疑的 索引的主要目的是减少查询的I/O。按照查询的表达方式,它既需要原始数据(以满足“select*”)也需要索引(对于where子句) 因此,数据库引擎将遍历索引。每次找到匹配的记录时,它都会将页面带入成员。你有一个I/O命中。因为您的表太大了,所以可能还没有看到该页面,所以有一个真正的I/O命中 有趣的是,你的经验支持这一点。10000行大约是1秒。行数的100倍(一百万)约为100秒。您正在见证性能的线性
顺便说一下,如果您使用“select update”而不是“select*”,查询速度会更快。只能从索引中满足此查询。如果您有一个id列,您可以在(更新,id)上创建索引,然后执行“选择id”以提高性能。我尝试了很多方法,但都无法得到想要的结果。我需要从
表
中运行类似选择id
,名称
,标题
,注释
,其中已更新
=1 id上已经有一个主键索引。提高此查询性能的最佳方法是什么?这是我的最佳选择。在(更新,id)上创建索引。创建一个只有id的临时表。然后通过将此表连接回原始表来执行查询。如果这在性能方面起作用,那么问题是如何让单个查询以这种方式进行处理。