gpt4 book ai didi

mysql - 使用 OR 时的 SQL 性能问题

转载 作者:行者123 更新时间:2023-11-29 01:44:03 25 4
gpt4 key购买 nike

我有这个问题:

SELECT stringa FROM table WHERE stringb = 'x' OR stringb = 'y' OR stringb = 'z'

这只是一个简化版本,实际查询在一个查询中有超过 1,000 个“或”子句。

执行需要几分钟,这是不好的。

我试过像这样一次做一个查询:

SELECT stringa FROM table WHERE stringb = 'x'
SELECT stringa FROM table WHERE stringb = 'y'
SELECT stringa FROM table WHERE stringb = 'z'

但这需要更长的时间。我还尝试了一个像这样的大查询:

SELECT stringa FROM table WHERE stringb = 'x'
UNION
SELECT stringa FROM table WHERE stringb = 'y'
UNION
SELECT stringa FROM table WHERE stringb = 'z'

但这又花费了更长的时间。

如果有人有任何提高性能的建议,我们将不胜感激。我的表是 MyISAM,如果它很重要的话。

编辑:

表格结构如下:

列:

key (CHAR PRIMARY), stringa (CHAR), stringb (CHAR)

行看起来像这样:(key - stringa - stringb)

key - a - b
key - a - c
key - a - d
key - a - e
key - a - f
key - b - b
key - b - c
key - b - d
key - c - c
key - c - d
key - c - f
key - d - f

等等等 ..有将近一百万行。

我需要选择所有“stringa”,其中“stringb”等于 a OR b OR c 等。

当然,stringa 和 stringb 不仅仅是“a”和“b”,它们包含长度在 3 - 80 个字符之间变化的 CHAR。

希望对你有所帮助

最佳答案

首先,将列数据类型更改为varchar。尽管您可能听说过 char 据说速度更快,但代价是节省少量 CPU 以换取 I/O 的大幅增加(非常糟糕的交易)。

其次,您需要在 stringb 列上建立索引(如果它还没有的话)。索引不必是唯一的。

第三,许多 DBMS 对数以千计的 OR 条件没有问题,虽然通常这样的事情被表达为 WHERE stringb IN ('a', 'b', 'c', 'd', 'e' ...)

最后,在许多情况下,如果 JOIN 不能提供卓越的性能(尽管在某些 DBMS 或情况下可能),至少会提供更大的清晰度和重用性。例如,许多人做的一件事是创建一个字符串拆分函数,当传递格式为 'a,b,c,d,e' 的字符串时,返回一个包含单独项目的行集排。连接到这个行集很容易,只要客户端可以构造要拆分的字符串,您就可以动态驱动您的查询。

这是一种可能的 JOIN 方法:

CREATE TEMPORARY TABLE Keys (
Value varchar(30)
);

INSERT Keys VALUES ('x');
INSERT Keys VALUES ('y');
INSERT Keys VALUES ('z');

SELECT T.SomeColumns
FROM
YourTable T
INNER JOIN Keys K
ON T.stringb = K.Value

关于mysql - 使用 OR 时的 SQL 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11803493/

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