我知道有很多关于这个问题的问题
我读了很多。
我知道,对于性能而言,最好先在索引中使用高基数字段(最具选择性)。
话虽如此,我想在以下内容中发表评论的分支:Order of columns in a multi-column index in MySQL 并使其成为一个真正的Q.
说我保存国家ID(低基数)和人名(高基数) 同一个人身份可以存在于几个国家。
我有时需要从一个国家/地区检索所有人,有时需要联系特定国家/地区的特定人员。
对于国家/地区查询,我需要一个国家/地区的索引或以国家/地区开头的索引。 但第二个查询呢?
我应该使用带有country_id的单个索引,person_id(这是"字段的错误顺序"基数明智)或添加另一个索引person_id,country_id因此有两个索引 - 每个索引一个疑问?
如果出现以下情况会如何改变:
1)我有时也需要联系所有拥有相同person_id的人(不论国家)?
2)而不是国家我有大陆,国家,地区,城市,人的等级?
我不知道它有多重要,但如果确实如此 - 假设Q是关于MySQL的。
更新1
我不确定我是否足够清楚......
因为我说我需要询问一个国家的所有人(即... where country_id=?
),显然我应该有一个关于国家的索引......
当我需要同时查询国家/地区和人员时,我可以创建如下查询:
... where country_id=? and person_id=?
只需将索引扩展为(country_id,user_id)
并将其用于两个查询,或者我可以单独保留国家/地区索引(针对... where country_id=?
个查询)并添加新的(user_id,country_id)
并将我的两个字段查询写为... where person_id=? and country_id=?
,效率更高。
所以选项1:查询(country_id,user_id)
或... where country_id=? and person_id=?
... where country_id=?
索引
选项2:(country_id)
和(person_id,country_id)
的两个索引... where country_id=?
索引和... where person_id=? and country_id=?
索引
写完这样的内容之后,我也认识到第二个选项也提供了第一个Q变体的答案,其中还需要...where person_id=?
查询...
但仍然是基本情景 - 你会选择选项1还是2??
答案 0 :(得分:0)
只有在您知道两个查询的国家/地区ID时,才能使用单个索引“country_id,person_id”。如果你只是在person_id上查询,MySQL将不会使用索引。对此的解释如下:http://www.ovaistariq.net/17/mysql-indexes-multi-column-indexes-and-order-of-columns/
1)在person_id仅查询的情况下,无法使用“country_id,person_id”索引。
2)对于这种类型的查询,你只能使用以大陆开头的索引,如果你一直在查询(否则将忽略索引)。
如果您满足上述条件,以便一个索引实际上适用于两个查询,那么我认为只有一个索引是好的 - 首先选择性最强(假设适用于您的查询)。
如果你确实需要两个,我只会在索引中包含将要使用的字段(即它们在你的WHERE,ORDER BY或JOIN子句中)。使用不必要的列的成本是更慢的更新以及用于索引的更多内存(和磁盘)。
对于基本场景,我会使用选项1,因为它将节省更多空间,这将节省用于索引的内存,从而将其释放用于其他索引或页面缓存。如果你确实需要...其中person_id =?样式查询,选项2将是一个很好的解决方案。