如果索引字段也是外键,我应该使用多索引方法吗?

Should I use multiple index method if indexed fields are also foreign keys?

添加外键后mysql强制索引之前用多索引方法索引的键。我用的是InnoDB。

这是我的 table:

的结构

idcompany_idstudent_id ...

company_idstudent_id 已使用以下方式编制索引:

ALTER TABLE `table` ADD INDEX `multiple_index` (`company_id`,`student_id`)

为什么我使用多个索引列?因为,我查询最多的时间是:

SELECT * FROM `table` WHERE company_id = 1 AND student_id = 3

有时我只是通过 student_id:

获取列
SELECT * FROM `table` WHERE student_id = 3

company_idstudent_id 添加外键后 mysql 分别为它们建立了索引。所以,现在我有多个单独索引的字段。

我的问题是我应该删除多个索引键吗?

视情况而定。如果同一个学生属于很多公司,不,不要放弃。当查询company_id = 1 AND student_id = 3时,优化器必须选择一个索引,然后,它必须检查多个学生或多个公司。

但我的直觉告诉我情况并非如此;学生不会与超过 10 家公司相关联,因此稍微浏览一下索引不会有什么大不了的。也就是说,这比在两列上都有索引要脆弱得多。在那种情况下,优化器知道在这里做什么是正确的。当它有两个索引可供选择时,它可能不会,将来也可能不会,因此您应该 FORCE INDEX 以确保它使用 student_id 索引。

要考虑的另一件事是如何使用此 table。如果它很少被写入但经常被读取,那么对于额外的索引,除了 space 之外没有太多的惩罚。

TL;DR: 索引不是多余的。要不要留这个问题很复杂。