我得到一个~400K记录的innoDB表。很少(如果不是永远)更新。
最常见的请求是select count(*),其中where子句由逻辑AND中的几个条件组成,如下所示:
A = value(int,indexed,值范围从4到14) B =值(varchar(1),索引,26个不同的可能值)
然后得到一个可变数量的Cx<价值条件(从0到26的条件) 每个Cx匹配一个int类型的列,值范围从0到7。
Cx列最初未编入索引。我尝试将它们编入索引,但没有明显的性能影响。
欢迎任何优化该查询的想法。
除了尝试优化该查询本身之外,我还处于第二级优化,在这种情况下,我得到大约25个连续请求,每个请求具有相同的Cx条件集但是A和A的值不同乙
您是否认为仅从Cx条件集合构建临时表,然后从具有A et B条件的临时表中进行选择将是否熟练?
------------------
更新1 考虑重新编写查询并在表格中添加额外的字段...我已经忘记了一些基础,感谢Bernd,Bob和Rick让我了解了基础。
> A /据说这个表很少,如果从未更新,我改变了MyISAM的引擎。 除了将其大小缩小到其原始innoDBsize的2/3之外,这使查询的性能提高了25%。 然后,B / I考虑了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。
我快乐了! 谢谢大家的建议。
答案 0 :(得分:1)
我相信,您不需要任何额外的查询优化。如果它运行缓慢,则需要检查数据库设置。或者,它可能是一些硬件问题。 我在小型虚拟服务器(1个CPU,512M RAM)上进行了一些测试:
mysql> create table t (a int(1), b varchar(1), c1 int(1), c2 int(1), c3 int(1), c4 int(1));
mysql> create index ia on t(a) ;
mysql> create index ib on t(b) ;
然后,我将加载40万套随机数据
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)
没有任何额外的调整看起来很好
答案 1 :(得分:-1)
INDEX(a,b,c1)
a
和b
需要先用=
进行测试。然后选择一个c。所有查询都将受益于a
和b
;一个人将受益更多。
(首先是a
或b
无关紧要;效果会相同。)
是的,你可以有26个。也许那更好。
要使表更小(因此可能更快),请将4字节INTs
更改为1字节TINYINT UNSIGNED
(假设值介于0和255之间)。