mysql - 一个复合索引还是多个外键索引?

标签 mysql sql

为关系表的所有外键创建覆盖索引和为关系表的每一列(外键)创建一个索引有什么区别?

例如,我有表sales(p_id, e_id, c_id, ammount),其中p_id是外键(产品表),e_id是外键(员工表),c_id是外键(客户表)。该表的主键是{p_id, e_id, c_id}。 哪个更好?

CREATE INDEX cmpindex ON sales(p_id, e_id, c_id)

或者

CREATE INDEX pindex on sales(p_id)
CREATE INDEX eindex on sales(e_id)
CREATE INDEX cindex on sales(c_id)

我主要在关系表和父表上运行带有联接的查询。

最佳答案

哪一个更好取决于您的实际查询。

需要理解的一件事是,当您在查询中加入表 sales 一次时,它只会(最多)使用一个索引。因此,您需要确保有最适合查询的索引可用。

如果您始终将 sales 表加入到所有其他三个表(customerproductemployee)那么首选复合索引,假设引擎将实际使用它而不执行表扫描。

当涉及到结果的顺序时,复合索引中字段的顺序很重要。例如,如果您的查询要按产品(首先)对结果进行分组,然后对每个客户的详细信息进行排序,那么您可以从首先包含产品 ID、然后是客户 ID 的索引中受益。

但也可能是引擎决定最好首先开始扫描表 sales,然后使用其他三个表各自的主键索引加入它们。在这种情况下,不会使用 sales 表中存在的索引。

找出答案的唯一方法是获取查询的执行计划,并查看定义索引时将使用哪些索引。

如果您在 sales 表上只有一个查询,则无需拥有多个索引。但更有可能的是,您有多个查询输出完全不同的结果,具有不同的字段选择、过滤器、分组等。

在这种情况下,您可能需要多个索引,其中一些索引用于一种类型的查询,另一些则用于其他类型的查询。请注意,您的建议并不相互排斥。您可能会受益于多个复合索引,它们只是具有不同的字段顺序。

显然,大量索引会减慢这些表中的数据更改速度,因此您也需要考虑这种权衡。

关于mysql - 一个复合索引还是多个外键索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50406816/

相关文章:

php - 选择多对多关系中没有类别的记录

mysql - 如何加速我的 MySQL UUID v4 存储函数?

Javascript 与 PHP 动态通信

java - 如何将 MySQL 异常传播到 Java 程序?

sql - 在 SQL Server 中将行数据转换为列

SQL 多个 GROUP BY 表示在单行中

sql - 查询在客户端应用程序中需要很长时间,但在 SQL Server Management Studio 中很快

mysql - 减少表中的行

mysql - 如何访问子查询中的列?

php - 如何保护本地托管网站的源代码?