我目前有一个这样的表设置,其中'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 ... ]
-
All 我对info表的查询将包含eventId和stageId的WHERE子句,永远不会出现在单个查询中需要多个eventIds和stageIds的情况 .
-
我只能通过stageId查询,因为它们可以连接到多个eventId .
-
如上例所示,eventIds和stageIds可能不会组合在一起 .
MySQL查询并不复杂,没有连接:
SELECT * FROM info WHERE eventId = 1 AND stageId = 1
在这种情况下,我应该单独或一起索引 eventId
和 stageId
列作为多索引 . 那里的信息经常最终说'it depends on your setup' .
读取多索引是否更快?是否存在可能不值得的开销?我应该坚持两者的正常指数吗?
2 回答
在您的特定情况下,最好在单个索引中使用
eventId
和stageId
,假设两个字段都有许多不同的值 .根据MySql documentation,如果你有2个单独的索引,MySql将只使用其中一个:
但是,如果一个字段具有例如几十个值而另一个字段具有数百万个,则最好仅对另一个字段进行索引以减小密钥大小 .
如果您的查询同时使用了列(eventId和StageId),则索引应包含这两列 . 在eventId和StageId上有两个单独的索引对于需要在两者上进行查询的查询都没有帮助 . 同时查看你的数据我会假设eventId的基数很小,所以我将把eventId作为索引中的第一个 .
此外,如果您对信息表有任何仅依赖于eventId或stageId的查询,那么您可以订购索引并将该列放在索引中 . 在带有(eventId,stageId)的索引中,将处理查询以及{eventId,StageId}
此外,如果eventId和StageId在信息表中是唯一的,您可以简单地将其声明为主键并取消id .