我正在考虑在表上应用3个字段(type,status,user_id)的索引。我的大多数查询都有使用全部3的WHERE。但是,我有几个使用频繁的查询,只使用2个字段(类型和状态)。
我的问题是,创建一个包含所有3个字段的索引是否可以通过仅真正比较2个字段的查询来有效使用?或者更好的是有2个索引,一个有3个字段,一个有2个?
答案 0 :(得分:4)
我比MySQL更了解Oracle,但我想在这种情况下它是一样的。索引通常是B-Tree,这意味着如果索引是(type, status, user_id)
,数据库通常仍然可以使用它来搜索(type, status)
,因为它是组合索引的第一部分。但是如果你使用(status, user_id)
就不会出现这种情况,除非有类似Oracle的INDEX_SKIP_SCAN。
第二个索引只覆盖两个字段可能会稍快一些,取决于数据的多少。但是如果你有两个索引,那么插入数据的速度会慢一些,因为它们都需要维护。它还需要更多磁盘空间。所以这是一个只有你能决定的性能空间权衡。
答案 1 :(得分:1)
是的,您可以像在ewernli中提到的那样在MySQL中部分使用索引。
答案 2 :(得分:0)
看起来像一个BTREE索引,按顺序排序(按顺序:type,status,user_id),在这种情况下,一个索引可以在两个查询中使用:只使用2个字段(类型和状态)
如果您只查询user_id,则此索引无法帮助您。