mysql索引,单列还是多列?

taor4pac  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(640)

我现在有一个这样设置的表,其中'info'表与'event'和'stage'表挂钩。
事件表

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 ... ]

我对info表的所有查询都将包含eventid和stageid的where子句,在一个查询中永远不会需要多个eventid和stageid。
我不能只通过stageid进行查询,因为它们可以连接到多个eventid。
如我上面的示例所示,eventid和stageid可能没有组合在一起。
mysql查询并不复杂,没有连接:

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

在这种情况下,我不确定是否应该在'info'表中索引 eventId 以及 stageId 列单独或一起作为多索引。在那里的信息往往会说'这取决于你的设置'。
多索引的读取速度更快吗?是否存在不值得的管理费用?我应该在这两个方面都使用正常索引吗?

n1bvdmb6

n1bvdmb61#

在您的具体情况下,最好使用 eventId 以及 stageId 在单个索引中,假设两个字段都有许多不同的值。
根据mysql文档,如果您有两个单独的索引,mysql将只使用其中一个:
如果在多个索引之间有选择,mysql通常使用查找最少行数的索引。
但是,如果一个字段有几十个值,而另一个字段有数百万个值,那么最好只对另一个字段进行索引以减小键的大小。

lvmkulzt

lvmkulzt2#

如果查询同时使用这两列(eventid和stageid),那么索引应该同时包含这两列。在eventid和stageid上有两个单独的索引对需要同时查询这两个索引的查询没有帮助。同时查看您的数据,我假设eventid的基数很小,因此,我将eventid作为索引中的第一个。
另外,如果您对info表有任何只依赖于eventid或stageid的查询,那么您可以对索引进行排序,并将该列放在索引的第一位。在带有(eventid,stageid)的索引中,将处理带有查找{eventid}和{eventid,stageid}的查询
另外,如果eventid和stageid对于in info表是唯一的,您可以简单地将其声明为主键并去掉id。

相关问题