分类字段需要索引吗?(MySQL或MongoDB)

分类字段需要索引吗?(MySQL或MongoDB),mysql,mongodb,indexing,Mysql,Mongodb,Indexing,对于表(比如“food”),有一列“type”,其潜在值为[1,2,3,4],用于指定该条目的类型(例如水果)。正如我所期望的那样 SELECT name FROM food WHERE type = 3 ; 我想知道在这种情况下是否会推荐索引。由于该字段可能只有几个值,我想知道该索引是否有用。(类似于MongoDB?这样一个字段上的索引在MySQL中可能没有用处。实际上,这样的索引可能会使大多数查询变得更糟 在这种情况下,索引总是更快。这是一个仅使用索引中的列的查询,例如: sele

对于表(比如“food”),有一列“type”,其潜在值为[1,2,3,4],用于指定该条目的类型(例如水果)。正如我所期望的那样

SELECT name FROM food WHERE type = 3 ;    

我想知道在这种情况下是否会推荐索引。由于该字段可能只有几个值,我想知道该索引是否有用。(类似于MongoDB?

这样一个字段上的索引在MySQL中可能没有用处。实际上,这样的索引可能会使大多数查询变得更糟

在这种情况下,索引总是更快。这是一个仅使用索引中的列的查询,例如:

select count(type)
from food
where type = 3;
这会更快,因为读取索引应该比读取表更快,因为数据更小(可能,您可以包括索引中的所有列)

在其他情况下,MySQL在表可用时使用索引

您要问的问题是关于索引的“选择性”。考虑你的查询:

SELECT name
FROM food
WHERE type = 3 ; 
如果所有行都有
type=3
,那么您必须读取所有匹配的记录(以获取
name
的值)。如果每页有一条记录,那么索引可能会帮助您,因为它减少了页面读取的次数。更现实的情况是一个页面包含100条记录。然后,如果25%的记录具有相同的类型,则一个典型页面上会有25条这样的记录。基本上,每一页都必须阅读。问题是页面是按顺序读取(“完整表扫描”)还是通过索引读取

这两种阅读表格的方法是不同的。在全表扫描中,按顺序读取页面,一旦读取页面,就不会再次访问该页面。在索引读取中,页面随机读取,一次读取一条记录,一个页面可以多次读取。在极端情况下,页面不适合页面缓存,同一页面被刷新到磁盘,并针对页面上的每条记录一次又一次地读取。效率很低

通过在
type,name
上设置索引,可以提高查询效率


因此,您的问题的答案是要小心索引,特别是对于大型表。当您在分类列上有索引时,将其设为复合索引,这样您的查询就可以只使用索引而不必返回到数据页。

在MySQL中,这样一个字段上的索引可能没有用处。实际上,这样的索引可能会使大多数查询变得更糟

在这种情况下,索引总是更快。这是一个仅使用索引中的列的查询,例如:

select count(type)
from food
where type = 3;
这会更快,因为读取索引应该比读取表更快,因为数据更小(可能,您可以包括索引中的所有列)

在其他情况下,MySQL在表可用时使用索引

您要问的问题是关于索引的“选择性”。考虑你的查询:

SELECT name
FROM food
WHERE type = 3 ; 
如果所有行都有
type=3
,那么您必须读取所有匹配的记录(以获取
name
的值)。如果每页有一条记录,那么索引可能会帮助您,因为它减少了页面读取的次数。更现实的情况是一个页面包含100条记录。然后,如果25%的记录具有相同的类型,则一个典型页面上会有25条这样的记录。基本上,每一页都必须阅读。问题是页面是按顺序读取(“完整表扫描”)还是通过索引读取

这两种阅读表格的方法是不同的。在全表扫描中,按顺序读取页面,一旦读取页面,就不会再次访问该页面。在索引读取中,页面随机读取,一次读取一条记录,一个页面可以多次读取。在极端情况下,页面不适合页面缓存,同一页面被刷新到磁盘,并针对页面上的每条记录一次又一次地读取。效率很低

通过在
type,name
上设置索引,可以提高查询效率


因此,您的问题的答案是要小心索引,特别是对于大型表。如果在分类列上有索引,请将其设为复合索引,这样您的查询就可以只使用索引而不必返回到数据页。

拥有索引不太可能有帮助,但您应该使用查询和数据对其进行测试。如果列没有几个不同的值,查询将返回表中相当大的一部分行,读取索引相当于对整个表进行扫描。事实上,全表扫描甚至可能比读取索引更快


如果行的类型用于其他查询,则将该类型作为多列索引的一部分可能会有所帮助。

拥有该索引可能不会有帮助,但您应该使用查询和数据对其进行测试。如果列没有几个不同的值,查询将返回表中相当大的一部分行,读取索引相当于对整个表进行扫描。事实上,全表扫描甚至可能比读取索引更快


如果行的类型用于其他查询,则将该类型作为多列索引的一部分可能会有所帮助。

这取决于对其运行的其他查询以及文档的架构和磁盘上文档的大小,以及此服务器是否具有ssdsIt取决于对其和架构运行的其他查询对于文档和磁盘上文档的大小,以及该服务器是否有ssdsOh nvm意识到这是一个MySQL答案,将问题误读为MongoDB@Sammaye . . . 我想你是对的。我更新了答案(希望)更好地表达我想说的。是的,这更好,它同样适用于MongoDB在这种情况下,以及感谢您的详细回答!我在别的地方读到过