首页 文章

MySQL索引,单列还是多列?

提问于
浏览
1

我目前有一个这样的表设置,其中'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

在这种情况下,我应该单独或一起索引 eventIdstageId 列作为多索引 . 那里的信息经常最终说'it depends on your setup' .

读取多索引是否更快?是否存在可能不值得的开销?我应该坚持两者的正常指数吗?

2 回答

  • 0

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

    根据MySql documentation,如果你有2个单独的索引,MySql将只使用其中一个:

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

    但是,如果一个字段具有例如几十个值而另一个字段具有数百万个,则最好仅对另一个字段进行索引以减小密钥大小 .

  • 0

    如果您的查询同时使用了列(eventId和StageId),则索引应包含这两列 . 在eventId和StageId上有两个单独的索引对于需要在两者上进行查询的查询都没有帮助 . 同时查看你的数据我会假设eventId的基数很小,所以我将把eventId作为索引中的第一个 .

    此外,如果您对信息表有任何仅依赖于eventId或stageId的查询,那么您可以订购索引并将该列放在索引中 . 在带有(eventId,stageId)的索引中,将处理查询以及{eventId,StageId}

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

相关问题