mysql - 分类字段是否需要索引? (MySQL 或 MongoDB)

标签 mysql mongodb indexing

对于一个表(比如“食物”),有一个列“类型”,其潜在值 [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 - 分类字段是否需要索引? (MySQL 或 MongoDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17512123/

相关文章:

python - 使用多级索引重命名 pandas 中的列

mysql - 如果字段是另一个表中字段的子字符串,则从表中选择行

node.js "delete"的奇怪语法

php - MySQL 连接不工作 : 2002 No such file or directory

javascript - MongoDB,从数组中删除对象

mongodb - mongodb 中哪个消耗更多内存 bool 值或整数?

python - NumPy / python : Array iteration without for-loop

r - 对时间序列进行子集化,以便选定的行在某个最小时间上有所不同

Mysql VIEW 具有显式列数据类型?

mysql - 如何编写 SQL 查询,其中 WHERE 子句使用转换为 long 的子字符串?