如果索引字段也是外键,我应该使用多索引方法吗?
Should I use multiple index method if indexed fields are also foreign keys?
添加外键后mysql强制索引之前用多索引方法索引的键。我用的是InnoDB。
这是我的 table:
的结构
id
、company_id
、student_id
...
company_id
和 student_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_id
和 student_id
添加外键后 mysql 分别为它们建立了索引。所以,现在我有多个单独索引的字段。
我的问题是我应该删除多个索引键吗?
视情况而定。如果同一个学生属于很多公司,不,不要放弃。当查询company_id = 1 AND student_id = 3
时,优化器必须选择一个索引,然后,它必须检查多个学生或多个公司。
但我的直觉告诉我情况并非如此;学生不会与超过 10 家公司相关联,因此稍微浏览一下索引不会有什么大不了的。也就是说,这比在两列上都有索引要脆弱得多。在那种情况下,优化器知道在这里做什么是正确的。当它有两个索引可供选择时,它可能不会,将来也可能不会,因此您应该 FORCE INDEX
以确保它使用 student_id 索引。
要考虑的另一件事是如何使用此 table。如果它很少被写入但经常被读取,那么对于额外的索引,除了 space 之外没有太多的惩罚。
TL;DR: 索引不是多余的。要不要留这个问题很复杂。
添加外键后mysql强制索引之前用多索引方法索引的键。我用的是InnoDB。
这是我的 table:
的结构id
、company_id
、student_id
...
company_id
和 student_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_id
和 student_id
添加外键后 mysql 分别为它们建立了索引。所以,现在我有多个单独索引的字段。
我的问题是我应该删除多个索引键吗?
视情况而定。如果同一个学生属于很多公司,不,不要放弃。当查询company_id = 1 AND student_id = 3
时,优化器必须选择一个索引,然后,它必须检查多个学生或多个公司。
但我的直觉告诉我情况并非如此;学生不会与超过 10 家公司相关联,因此稍微浏览一下索引不会有什么大不了的。也就是说,这比在两列上都有索引要脆弱得多。在那种情况下,优化器知道在这里做什么是正确的。当它有两个索引可供选择时,它可能不会,将来也可能不会,因此您应该 FORCE INDEX
以确保它使用 student_id 索引。
要考虑的另一件事是如何使用此 table。如果它很少被写入但经常被读取,那么对于额外的索引,除了 space 之外没有太多的惩罚。
TL;DR: 索引不是多余的。要不要留这个问题很复杂。