mysql—使用多个<;测验

mysql—使用多个<;测验,mysql,optimization,Mysql,Optimization,我得到一个innoDB表,包含约4000k条记录。很少(如果不是从未)更新 最常见的请求是select count(*),其中where子句由逻辑AND中的几个条件组成,如下所示: A=值(整数,索引,值范围从4到14) B=值(varchar(1),索引,26个不同的可能值) 然后是数量可变的Cx

我得到一个innoDB表,包含约4000k条记录。很少(如果不是从未)更新

最常见的请求是select count(*),其中where子句由逻辑AND中的几个条件组成,如下所示:

A=值(整数,索引,值范围从4到14) B=值(varchar(1),索引,26个不同的可能值)

然后是数量可变的Cx<值条件(从0到26个条件) 每个Cx匹配一个int类型的列,值范围从0到7

Cx列最初没有索引。我尝试为它们编制索引,但没有明显的性能影响

任何优化该查询的想法都是受欢迎的

除了试图优化该查询本身,我还处于第二级优化阶段,在这种情况下,我将得到大约25个执行请求,每个请求都有一组相同的Cx条件,但a和B的值不同

您是否认为仅从一组Cx条件构建一个临时表,然后从带有et B条件的临时表中进行选择是可行的

--------------

更新1 正在考虑重新格式化查询并向表中添加额外字段。。。多亏伯纳德、鲍勃和里克把我带到了basis,我忘记了一些basis

A/据说这个表很少更新,如果不更新的话,我为MyISAM更换了引擎。 除了将其大小压缩到原来innoDBsize的2/3之外,这还将查询的性能提高了25%

然后,我考虑了A和B索引的较差基数。此外,这也解释了我的配置与Bob的配置之间的巨大差异: A列和B列中的值分布远非随机的。它们接近完美的高斯分布,例如平均值-A=10和stdev-A=1,这说明绝大多数人口得到的是A={9,10,11},这使得相关的指数最终没有选择性。 B的观察结果类似

虽然B实际上不是一个单列,但可以是B1、B2、B3、B4列,但我定义了4个复合索引(a、Bi),这导致性能乘以4

总的来说,性能乘以5

我快快乐了!
谢谢大家的建议

我相信,您不需要对查询进行任何额外的优化。如果运行缓慢,则需要检查数据库设置。或者,这可能是一些硬件问题。 我在小型虚拟服务器(1个CPU,512M RAM)上进行了一些测试:

然后,我将加载400000组随机数据

insert into t values
(6, 'T', 4, 6, 3, 4),
(12, 'z', 3, 5, 6, 1),
...

mysql> select count(*) from t where a=5 and b='x' and c1 > 5;
+----------+
| count(*) |
+----------+
|      340 |
+----------+
1 row in set (0.04 sec)

看起来不错,没有任何额外的调整

我相信,您不需要对查询进行任何额外的优化。如果运行缓慢,则需要检查数据库设置。或者,这可能是一些硬件问题。
INDEX(a,b,c1)
我在小型虚拟服务器(1个CPU,512M RAM)上进行了一些测试:

然后,我将加载400000组随机数据

insert into t values
(6, 'T', 4, 6, 3, 4),
(12, 'z', 3, 5, 6, 1),
...

mysql> select count(*) from t where a=5 and b='x' and c1 > 5;
+----------+
| count(*) |
+----------+
|      340 |
+----------+
1 row in set (0.04 sec)
看起来不错,没有任何额外的调整

INDEX(a,b,c1)
a
b
需要排在第一位,因为它们是用
=
测试的。然后选一个c。所有查询都将受益于
a
b
;我们将进一步受益

(无论哪个先到,
a
还是
b
,性能都是一样的。)

是的,你可以有26个。也许这样更好

要使表格更小(因此可能更快),请将4字节的
int
更改为1字节的
TINYINT UNSIGNED
(假设值介于0和255之间)

a
b
需要排在第一位,因为它们是用
=
测试的。然后选一个c。所有查询都将受益于
a
b
;我们将进一步受益

(无论哪个先到,
a
还是
b
,性能都是一样的。)

是的,你可以有26个。也许这样更好


要使表更小(因此可能更快),请将4字节的
int更改为1字节的
TINYINT UNSIGNED
(假设值介于0和255之间)。

创建一个有用的(复合)索引并优化查询,但我看不到它们。例如,您的意思是添加26个复合索引(a、B、c1)、(a、B、c2)?或者一个综合指数(c1,c2,…,C26)?只有一个综合指数。田野的秩序是无能的。减少结果最多的字段必须是第一个字段,以此类推,如果说一个综合指数限制在16列,我至少需要两列。我将尝试考虑一些统计数据来确定排序者。非常感谢你的提示。顺便说一下,我对你的“最能降低结果的字段”的精确度感到困惑。因为我可以得到一个可变数量的Ci语句,所以首先设置最常用的Ci不是更有效吗,而不管它是减少使用次数较少的Ci。v、 g.根据使用频率而不是“减少”因子进行排序?创建一个有用的(复合)索引并优化查询,但我看不到它们。例如,您的意思是添加26个复合索引(a、B、c1)、(a、B、c2)?或者一个综合指数(c1,c2,…,C26)?只有一个综合指数。田野的秩序是无能的。减少结果最多的字段必须是第一个字段,以此类推,如果说一个综合指数限制在16列,我至少需要两列。我将尝试考虑一些统计数据来确定排序者。非常感谢你的提示。顺便说一下,我对你的“最能降低结果的字段”的精确度感到困惑。因为我可以得到一个可变数量的Ci语句,所以首先设置最常用的Ci不是更有效吗,而不管它是减少使用次数较少的Ci。v、 g.根据使用频率而不是“减少”因素订购?感谢测试Bob。f