【发布时间】:2011-11-25 07:45:38
【问题描述】:
我有一个存储大约 50k 行的表,这是我的查询:
select * from video where status = 1 and filter = 1 and category = 4
这些列是 tinyint,我想知道我应该在这些列上做索引吗?
【问题讨论】:
标签: mysql indexing where-clause
我有一个存储大约 50k 行的表,这是我的查询:
select * from video where status = 1 and filter = 1 and category = 4
这些列是 tinyint,我想知道我应该在这些列上做索引吗?
【问题讨论】:
标签: mysql indexing where-clause
不!
您应该始终考虑索引选择性!如果索引上的 where 子句的结果将返回超过 20% 的表,则该索引未被使用,但它被保留。
因此,例如,您的视频状态将为 1、2、3,那么您就有 3 种可能的状态。如果这些指数分布良好,我们可以认为这将是其中的 33.3%。然后,查询:
select * from video where status = 1
不会使用该索引!相反,将使用 FULL TABLE SCAN。
请阅读。这真的很重要,也是一个常见的错误。
【讨论】:
如果您为此查询创建索引,请尝试(status, filter, category)(顺序可能不同)。
但这取决于你的表格行中有多少百分比有(status, filter, category) = (1,1,4)。百分比越小,使用索引运行的查询就越好。正如 santiagobasulto 所指出的,如果索引选择性不高,则无论如何都不会将索引用于查询,但会运行表的完整扫描。
【讨论】:
我肯定会使用索引。他们使选择更快。但是如果表中有很多插入,那么我会再想一想。插入语句上的索引会增加很多重载,并且您的插入语句会很慢,因为每次插入时它都必须重新构建索引。
【讨论】: