混合使用的数据库索引中的字段顺序

时间:2014-04-27 08:41:05

标签: mysql sql indexing

我知道有很多关于这个问题的问题 我读了很多。
我知道,对于性能而言,最好先在索引中使用高基数字段(最具选择性)。

话虽如此,我想在以下内容中发表评论的分支: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??

1 个答案:

答案 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

对于基本场景,我会使用选项1,因为它将节省更多空间,这将节省用于索引的内存,从而将其释放用于其他索引或页面缓存。如果你确实需要...其中person_id =?样式查询,选项2将是一个很好的解决方案。