MySQL中多列索引中的列顺序

sba*_*gay 17 mysql indexing optimization

我正在尝试理解定义多列索引时更好的方法:

  • 把最具选择性的列放在第一位(更高的基数,速度?); 要么
  • 首先选择较少选择性的列(较低的基数,用于索引压缩?)

或者也许这取决于我是在优化速度还是空间?

Fab*_*anB 9

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

在这里阅读更多.

更新:

关于基数的问题,请阅读此内容.这与你的问题类似吗?它回答了吗?


Ric*_*iwi 4

始终将最具选择性的列放在开头,很少有理由相反。

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

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

索引的目的是协助查询,并且让它们按正确的顺序(基数)始终应该是首要考虑的因素。

  • 好的 - 假设我保存国家 ID(低基数)和人员 ID(高基数)。同一个人 ID 可以存在于多个国家/地区。我应该输入country_id、person_id 还是反之亦然?我有时需要检索一个国家/地区的所有人员,有时需要检索具有相同 person_id 的所有人员 (2认同)