如何正确地为大型mysql表使用索引?

时间:2016-07-29 07:10:17

标签: mysql indexing high-load

我在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优化器会选择正确的索引吗?我不确定,哪种方式更好,并且它们中的任何一种都可以工作。

1 个答案:

答案 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的内容。