我在MySQL 5.7.13中有一个表,它有3列(实际上比这更多,但这三列用于搜索) - 它有一列company_id
,它有一列{{1} },它有列department_id
。
现在,员工通常会这样工作,他们进入系统,选择与他们合作的公司,并选择部门(这是必须的)。之后他们转到菜单,可以从表中获取数据而不指定状态,或者他们还可以指定他们想要的状态?
因此,由于mysql索引的前缀顺序,使用复杂索引(company_id,department_id,status)似乎很自然。因为他们总是按公司和部门过滤,有时候按地位过滤,所以一切都很好。
但是,最近增加了一项新功能。还有一些特殊的员工,与普通用户不同,他们只选择公司,而不选择部门。因此,他们的查询按公司和状态过滤。这意味着索引中断,它只会按公司而不是按状态进行过滤,因为省略了部门。
有什么解决方法?我在这看到两个解决方案。一个是状态非常有限 - 它基本上用于值 - 创建(1),SENT(2),接受(3),拒绝(4)。所以,我可以创建索引(company_id,status,department_id),如果用户没有选择任何状态,我可以在查询中添加如下内容:
status
索引会为此高效工作吗?或者,其他解决方案是创建第二个索引并同时具有(company_id,department_id,status)和(company_id,status,department_id),但是mysql优化器会选择正确的索引吗?我不确定,哪种方式更好,并且它们中的任何一种都可以工作。
答案 0 :(得分:0)
从我所看到的,这应该可以正常工作。优化程序将使用(x,y,z)
复合索引,并在需要时执行using index; using where
。请注意,我假设我的理解是复合的最左边部分已经是where子句的一部分,例如x
允许y
已经混合使用索引。
另一方面,如果IN
子句非常大,并且在单列索引上说,IN
将会很快得到满足。请参阅我在此处写的答案:Index uses IN。
当然,请查看名为EXPLAIN Syntax的MySQL手册页和类似Using EXPLAIN to Write Better MySQL Queries的内容。