MySQL 索引,单列还是多列?

标签 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 ... ]
  • All 我对信息表的查询将包含一个用于 eventId 和 stageId 的 WHERE 子句,永远不会出现我在单个查询中需要多个 eventId 和 stageId 的情况。
  • 我不能只通过 stageId 查询,因为它们可以连接到多个 eventIds。
  • 在我上面的例子中,eventIds 和 stageIds 不能组合在一起。

MySQL 查询并不复杂,没有连接:

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

在这种情况下,我一直不确定是否应该在“信息”表上分别索引 eventIdstageId 列,还是一起索引多指标。那里的信息通常以“这取决于您的设置”而告终。

读取多索引是否更快?是否有可能不值得的管理费用?我应该在两者上都使用普通索引吗?

最佳答案

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

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

If there is a choice between multiple indexes, MySQL normally uses the index that finds the smallest number of rows.

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

关于MySQL 索引,单列还是多列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53693908/

相关文章:

Python - 重新索引每月值

mysql - 在单个表上使用 Sql Join 两次

phpmyadmin - MYSQL 查询来计算 mysql 服务器中存在的模式数量

matlab - 如何使用 max 或 min 返回的多维索引?

mysql - 子查询(以及带有连接的查询)不使用 MySQL 索引 (MyISAM)

postgresql - 使用 desc 在 postgresql 上创建索引时出错

Mysql 在 600 万行表上的性能

mysql - 如何在此日期字符串 01/01/2004 中定位年份

java - 从 MySQL 数据库导入时无法复制到 Hadoop 中的 Datanode

java - 使用 Java 的 MySQL 数据库出现阿拉伯字符问题