【问题标题】:Order of columns in a multi-column index in MySQLMySQL中多列索引中的列顺序
【发布时间】:2011-06-14 05:19:10
【问题描述】:

我试图了解在定义多列索引时什么更好:

  • 将最具选择性的列放在首位(更高的基数,为了速度?);或
  • 将选择性较低的列放在首位(较低的基数,用于索引压缩?)

或者这取决于我是针对速度还是空间进行优化?

【问题讨论】:

  • 您的索引顺序由索引要服务的查询定义。一旦您通过查询定义了索引,您就无法选择它们出现的顺序,而不会使索引对某些查询不可用。
  • 再一次,我明白这一点,但是在服务于查询的两个选项之间 - 哪个更好,考虑到基数的巨大差异?
  • @sbargay 你有没有找到这个问题的答案?我知道你在问什么。如果你有 country_id 和 person_id,是设置索引 country_id、person_id 更好,还是先设置更高的基数与 person_id、country_id。看来您显然知道如何在查询中正确使用索引,但我和您有同样的问题。

标签: mysql optimization indexing


【解决方案1】:
WHERE person_id = 123 AND country_code = 'AT'

使用

INDEX(person_id, country_code)  -- in EITHER order!

这种情况下,索引列的顺序在速度上没有差异

是的,MyISAM 有“索引压缩”,但不再使用了。

基数只对比较单独的索引很重要,而不是对复合索引中的列进行排序。也就是说,

INDEX(person_id)  -- is better than
INDEX(country_code)

但两者都不如复合索引。

对于

WHERE person_name LIKE 'James%' AND country_code = 'UK'

最好的索引是

INDEX(country_code, person_name)   -- in THIS order!

WHERE 中的顺序对优化没有影响。

更多提示和讨论:http://mysql.rjweb.org/doc.php/index_cookbook_mysql

【讨论】:

    【解决方案2】:

    列的顺序应该与稍后查询列的顺序相匹配,否则 MySQL 将不会使用它们。 这是你真正应该思考的问题。

    阅读更多here

    更新:

    关于基数的问题可以阅读this。 这和你的问题相似吗?它会回答吗?

    【讨论】:

    • 我负责顺序(最左边可用于单列查询等),但仍然 - 我可以灵活地决定谁是第一,谁是第二。我正在寻找一个提示来选择哪个去哪里。
    • 您阅读链接了吗?要么我不明白这个问题,要么给出的答案是“按照他们通常被查询的顺序”。
    • 是的,我读过它:例如列上的索引 a=cardinality=23,b=cardinality=1000000,c=cardinality=500000。我的查询总是需要 a,b 或 a,b,c 列。
    • 如果您希望两个查询都能够使用所有 2/3 列的索引,那么您的索引必须在 (a,b,c) 上。
    • [这个 Enter 的东西在中间得到了这个评论] 是的,我读过它:例如列上的索引 a=cardinality=23,b=cardinality=1000000,c=cardinality=500000。我的查询需要 a、a、c 或 a、b、c 列。我基本上可以创建索引 (c,a,b)+(a) 或 (a,b,c)+(a,c)
    【解决方案3】:

    总是把最有选择性的列放在开头,很少有相反的理由。

    或者这取决于我是针对速度还是空间进行优化?

    让我这样说。如果它导致索引not to be used at all,那么使用更少的存储有什么意义?如果不是查询的覆盖索引,通常不会使用低基数索引(按列顺序排列),因为返回其他列的数据会非常昂贵。

    索引的意义在于协助查询,并且将它们按正确的顺序(基数)始终是首要考虑因素。

    【讨论】:

    • 好的 - 假设我保存了国家 ID(低基数)和个人 ID(高基数)。同一个人 ID 可以存在于多个国家/地区。我应该输入 country_id、person_id 还是反之?有时我需要检索一个国家/地区的所有人,有时需要访问具有相同 person_id 的所有人
    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2010-12-22
    • 2017-12-19
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多