我现在有一个这样设置的表,其中'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
列单独或一起作为多索引。在那里的信息往往会说'这取决于你的设置'。
多索引的读取速度更快吗?是否存在不值得的管理费用?我应该在这两个方面都使用正常索引吗?
2条答案
按热度按时间n1bvdmb61#
在您的具体情况下,最好使用
eventId
以及stageId
在单个索引中,假设两个字段都有许多不同的值。根据mysql文档,如果您有两个单独的索引,mysql将只使用其中一个:
如果在多个索引之间有选择,mysql通常使用查找最少行数的索引。
但是,如果一个字段有几十个值,而另一个字段有数百万个值,那么最好只对另一个字段进行索引以减小键的大小。
lvmkulzt2#
如果查询同时使用这两列(eventid和stageid),那么索引应该同时包含这两列。在eventid和stageid上有两个单独的索引对需要同时查询这两个索引的查询没有帮助。同时查看您的数据,我假设eventid的基数很小,因此,我将eventid作为索引中的第一个。
另外,如果您对info表有任何只依赖于eventid或stageid的查询,那么您可以对索引进行排序,并将该列放在索引的第一位。在带有(eventid,stageid)的索引中,将处理带有查找{eventid}和{eventid,stageid}的查询
另外,如果eventid和stageid对于in info表是唯一的,您可以简单地将其声明为主键并去掉id。