gpt4 book ai didi

mysql - 使用许多 < 测试优化 where 子句

转载 作者:行者123 更新时间:2023-11-30 22:07:26 25 4
gpt4 key购买 nike

我得到了一个约 40 万条记录的 innoDB 表。很少(如果不是从不)更新。

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

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

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

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

欢迎任何优化该查询的想法。

除了尝试优化该查询本身之外,我还处于第二级优化,我收到大约 25 个要发出的连续请求,每个请求都有相同的 Cx 条件集,但 A 和B.

您认为仅根据 Cx 条件集构建一个临时表,然后根据 A 和 B 的条件从该临时表中进行选择是否有利可图?

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

更新 1考虑重新创建查询并向表中添加额外的字段...我忘记了一些基础,感谢 Bernd、Bob 和 Rick 让我找到了基础。

A/有人说这张表很少更新,我更改了 MyISAM 的引擎。除了将其大小压缩到原始 innoDB 大小的 2/3 之外,这还将查询性能提高了 25%。

B/然后我考虑了 A 和 B 索引的差基数。添加的事实解释了我的配置与 Bob 的配置之间的巨大差异。 :A 和 B 列中的值分布远非随机。它们接近于完美的高斯分布,例如 mean-A = 10 和 stdev-A = 1,这表明绝大多数人口得到 A = {9,10,11},这使得相关索引明确地没有选择性。B 的观察结果类似。

虽然说 B 实际上不是单个列,但可以是 B1、B2、B3、B4 列,我定义了 4 个复合索引(A,Bi),结果性能乘以 4。

所以所有性能总和乘以 5。

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

最佳答案

我相信,您不需要任何额外的查询优化。如果运行缓慢,则需要检查数据库设置。或者,它可能是一些硬件问题。我在小型虚拟服务器(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) ;

然后,我会加载 400 000 组随机数据

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)

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

关于mysql - 使用许多 < 测试优化 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41166144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com