Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL字段上的索引未按预期工作(innodb)_Mysql_Database_Database Design_Indexing_Innodb - Fatal编程技术网

MySQL字段上的索引未按预期工作(innodb)

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不好吗?一般来说,使

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

如果我跑步:

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的临时表。然后通过将此表连接回原始表来执行查询。如果这在性能方面起作用,那么问题是如何让单个查询以这种方式进行处理。