假设我有一个包含 3 列和数千条记录的表,如下所示:
id # primary key
name # indexed
gender # not indexed
我想找到“所有名为 Alex 的男性”,即特定的名字和特定的性别。
这种简单的方式(从 name='alex' 且性别=2 的人中选择 *
)是否足够好?或者是否有更优化的方法,例如名称子查询?
最佳答案
假设您没有数千条与姓名相匹配的记录,其中只有少数是真正的男性,那么 name
上的索引就足够了。一般来说,您不应该对基数很小的字段建立索引(只有 2 个可能的值意味着您将匹配 50% 的行,这并不能证明使用索引是合理的)。
我能想到的唯一有用的异常(exception)是,如果您仅选择姓名和性别,并且将它们都放入索引中,则可以执行索引覆盖查询
,该查询比通过索引选择行然后从表中检索数据更快。
关于并非所有列都建立索引时的 MySQL 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11682259/