【问题标题】:MySQL composite key best practiceMySQL 复合键最佳实践
【发布时间】:2014-02-26 16:15:36
【问题描述】:

我想这是一个性能问题。

创建复合键时顺序是否重要?

在我的例子中,复合键是使用一个名为 hash 的 128 位字符和一个名为 user_id 的外 (int) 键创建的。

例如 (hash, user_id) 会比 (user_id, hash) 快吗?

如果在连接中使用复合键会更慢吗?

CREATE INDEX composite_hash_user_id_index ON `user_false_positives` (`hash`, `user_id`);

【问题讨论】:

  • 是的。确实如此。但是 x 比 y 快吗?这是一个更难的问题。
  • 嗨,山姆,感谢您的反馈。当您说“MySQL 使用最左侧的索引”时,您是在谈论复合键的左侧部分。索引的那一部分是先使用的吗?
  • 如果您的问题是关于创建索引,那么答案基本上是否定的。如果问题是关于使用索引,那么顺序很重要。
  • 我会更新答案
  • 嗨,戈登。我说的是索引创建后的使用。

标签: mysql sql performance composite-key


【解决方案1】:

复合键中的顺序很重要。 MySQL 使用最左边的索引,因此它取决于您要运行的查询。你可以做一个覆盖索引。在(a,b) 上创建一个索引,然后在 b 上单独创建另一个索引。关于索引有很多注意事项。阅读下面的幻灯片 http://www.percona.com/sites/default/files/presentations/PMU-Bueno-Aires-2013-MySQL-Indexing-Best-Practices.pdf

最左边的索引示例:如果您在 (a,b) 上有索引并运行

SELECT * FROM table ORDER BY a

它会使用索引但是

SELECT * FROM table ORDER BY b

没有。因此,单独在 b 上设置另一个索引将确保在对数据进行排序时使用该索引。

【讨论】:

  • Sam,如果我尝试使用此复合键进行插入,它是否会比使用 UNIQUE 复合设置相反的方式(user_id,hash)慢?
  • 就写入而言,如果 hash 和 user_id 在总数据中具有相同的唯一性比率,则它是相同的。写重组索引,所以说起来很棘手。
【解决方案2】:

顺序很重要;该顺序应与查询中的 where 语句匹配,否则将不会使用索引 如果您在选择语句中使用了 where 子句,例如“where user_id=1 and hash='xxxxx'”,并且您的索引是 hash,user_id,则不会使用该索引。 更多示例可在此处获得 http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多