为关系表的所有外键创建覆盖索引和为关系表的每一列(外键)创建一个索引有什么区别?
例如,我有表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
表加入到所有其他三个表(customer
、product
和 employee
)那么首选复合索引,假设引擎将实际使用它而不执行表扫描。
当涉及到结果的顺序时,复合索引中字段的顺序很重要。例如,如果您的查询要按产品(首先)对结果进行分组,然后对每个客户的详细信息进行排序,那么您可以从首先包含产品 ID、然后是客户 ID 的索引中受益。
但也可能是引擎决定最好首先开始扫描表 sales
,然后使用其他三个表各自的主键索引加入它们。在这种情况下,不会使用 sales
表中存在的索引。
找出答案的唯一方法是获取查询的执行计划,并查看定义索引时将使用哪些索引。
如果您在 sales
表上只有一个查询,则无需拥有多个索引。但更有可能的是,您有多个查询输出完全不同的结果,具有不同的字段选择、过滤器、分组等。
在这种情况下,您可能需要多个索引,其中一些索引用于一种类型的查询,另一些则用于其他类型的查询。请注意,您的建议并不相互排斥。您可能会受益于多个复合索引,它们只是具有不同的字段顺序。
显然,大量索引会减慢这些表中的数据更改速度,因此您也需要考虑这种权衡。
关于mysql - 一个复合索引还是多个外键索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50406816/