如果我试图提高使用来自特定表的 4 个不同列的查询的性能,我应该创建 4 个不同的索引(每列单独一个)还是应该创建 1 个包含所有列的索引?
3 回答
根据我的经验,一个包含所有 4 个值的索引是最快的。如果您使用 where,请尝试将列按对 where 有用的顺序排列。
包含所有四列的索引;WHERE 中使用的列应该首先出现,而您进行 == 比较的列应该首先出现。
有时,优先考虑整数列会得到更好的结果;YMMV。
例如,
SELECT title, count(*) FROM table WHERE class = 'post' AND topic_id = 17
AND date > @@BeginDate and date < @@EndDate;
将有一个索引:topic_id、post、date 和 title,按此顺序。
索引中的“title”只是为了让数据库可以为那些匹配查询的记录找到“title”的值,而不需要额外访问数据表。
第一个字段上的记录分布越平衡,您将获得最好的结果(在此示例中,假设 10% 的行的 topic_id = 17,您将丢弃其他 90% 而无需运行字符串比较使用 'post' -- 并不是说字符串比较特别昂贵。根据数据,您可能会发现先索引日期并稍后发布,甚至使用日期优先作为 MySQL PARTITION 会更好。
单索引通常比索引合并更有效,所以如果你有像f1 = 1 AND f2 = 2 AND f3 = 3 AND f4 = 4
单索引这样的条件,那就是正确的决定。
为了获得最佳性能,按基数降序(不同值的计数)枚举索引字段,这将有助于减少分析的行数。
少于 4 个字段的索引可能更有效,因为它需要更少的内存。
http://www.mysqlperformanceblog.com/2008/08/22/multiple-column-index-vs-multiple-indexes/