MySQL:在where子句中将索引应用于具有4个用户控制条件的利益查询

时间:2016-09-21 10:02:14

标签: mysql optimization indexing

假设我有一个简单的查询结构,如下所示:

Select columns,
FROM table
WHERE CONDITIONS

我有4个参数: A B C ,& D 。这些参数定义搜索条件。例如:

Select columns,
FROM table
WHERE A = 'something' AND B = 'something'

Select columns,
FROM table
WHERE A = 'something' AND B = 'something' AND C = 'Something'

可以有几个示例,每次我都可以定义不同的搜索条件,例如上面提到的两个查询之间的差异

以下是我可以应用于WHERE条款

的不同搜索组合
1.  WHERE A = 'something' AND B = 'something' AND  C = 'something' AND  D = 'something'
2.  WHERE A = 'something' AND B = 'something' AND  C = 'something'
3.  WHERE A = 'something' AND B = 'something'
4.  WHERE A = 'something' AND C = 'something'
5.  WHERE A = 'something' AND D = 'something'
6.  WHERE A = 'something'
7.  WHERE B = 'something' AND C = 'something' AND  D = 'something'
8.  WHERE B = 'something' AND C = 'something'
9.  WHERE B = 'something' AND D = 'something'
10. WHERE B = 'something'
11. WHERE C = 'something' AND D = 'something'
12. WHERE C = 'something'
13. WHERE D = 'something'

我可以在此定义哪些指标?请记住,我定义了最少数量的索引并优化了所有搜索方案。

为表定义的主键是:

PRIMARY KEY(A,B,C,D)

修改

数据类型如下:

    A (VARCHAR)
    B (VARCHAR)
    C (INT)
    D (DATE)

2 个答案:

答案 0 :(得分:1)

由于您为每个可能的搜索组合维护单独的查询,因此据我所知,您需要 4 indice s。

您已经有A,B,C,D (PK)

A,B,C,D索引将使用以下搜索方案:

A,B,C,D
A,B,C
A,B
A

B,C,D索引将使用以下搜索方案:

B,C,D
B,C
B

C,D索引将使用以下搜索方案:

C,D
C

D索引将使用以下搜索方案:

D

<击>

修改

很抱歉遗漏了其他案件。感谢@Rick James。

实际上,A,B,C,D列中所有可能的搜索组合如下:

长度= 4

1.  A,B,C,D

长度= 3

2.  A,B,C
3.  A,C,D
4.  A,B,D
5.  B,C,D

长度= 2

6.  A,B
7.  A,C
8.  A,D
9.  B,C
10. B,D
11. C,D

长度= 1

12. A
13. B
14. C
15. D

索引必需(8):

A,B,C,D 
A,C,D 
A,B,D
B,C,D
A,D
B,D
C,D
D

注意:在某些情况下,多个索引可以注册提供。但是决定由optimizer决定,而optimizer单独决定使用哪个索引。

答案 1 :(得分:0)

对于所有13个案例来说,或许最低可以达到6个,每个案例最佳:

The PK takes care of 1,2,3,6.
INDEX(A,C) takes care of 4.
INDEX(D,A) takes care of 5,13.
INDEX(B,C,D) takes care of 7,8,10.
INDEX(B,D) takes care of 9. (and 10)
INDEX(C,D) takes care of 11,12

一般情况下,当受到大量“需要”索引的威胁时,请停止使用2列。例如,INDEX(B,C)几乎与INDEX(B,C,D)一样好。考虑到这一点,我会为15个组合选择这6个:

AB; BC; CD; DA; AC; BD(注意AB已经涵盖了AB,所以不要添加它。)

警告:您的问题在所有测试中都显示=。相反,如果您对任何BETWEEN部分使用“范围”(<IN等)或ORWHERE,则此答案变得不那么理想了。