MySQL索引,单列还是多列?

时间:2018-12-09 15:39:14

标签: mysql indexing

我目前有一个这样的表,其中“信息”表连接到“事件”和“阶段”表。

活动表

id | categoryId | name
1  | 1          | Event1
2  | 2          | Event2
3  | 1          | Event3
[ ... About 100 rows ... ]

舞台表

id | categoryId |name
1  | 1          | Stage1
2  | 1          | Stage2
3  | 2          | Another Stage
[ ... About 200 rows ... ]

信息表

id | eventId | stageId | info
1  | 1       | 1       | Hello
2  | 1       | 2       | Something
3  | 1       | 1       | Else
4  | 2       | 3       | More
[ ... X00,000 rows ... ]
    我对信息表的查询
  • 所有都将为eventId和stageId包含WHERE子句,在任何查询中都不会出现需要多个eventId和stageId的情况。
  • 我不能仅通过stageId进行查询,因为它们可以连接到多个eventId。
  • 就像上面的示例一样,eventId和stageId可能不会分组在一起。

MySQL查询没什么复杂,没有联接:

SELECT * FROM info WHERE eventId = 1 AND stageId = 1

在这种情况下,我不确定是否应该在“信息”表上分别对eventIdstageId列进行索引或将它们作为多索引一起进行索引。那里的信息常常以“取决于您的设置”结尾。

读取多索引是否更快?有没有可能不值得的间接费用?我应该同时在两个索引上坚持正常索引吗?

2 个答案:

答案 0 :(得分:0)

如果您的查询同时使用了两个列(eventId和StageId),则索引应同时包含这两个列。在eventId和StageId上具有两个单独的索引不会对需要在两者上进行查询的查询有所帮助。同样查看您的数据,我认为eventId的基数很小,因此,我将eventId作为索引中的第一个。

此外,如果您对信息表进行任何查询,而这些查询仅取决于eventId或stageId,则可以对索引进行排序,并在索引中首先包含该列。如同在带有(eventId,stageId)的索引中一样,查询会同时查询{eventId}和{eventId,StageId}

此外,如果eventId和StageId在信息表中将是唯一的,则可以简单地将其声明为主键并取消使用id。

答案 1 :(得分:0)

在您的特定情况下,最好在单个索引中使用eventIdstageId,假设两个字段的值都不同。

根据MySql documentation,如果您有2个单独的索引,则MySql将仅使用其中之一:

  

如果在多个索引之间进行选择,则MySQL通常使用   找到最小行数的索引。

但是,如果一个字段具有例如几十个值而另一个字段具有数百万个值,则最好仅索引另一个字段以减小键的大小。