我有这样的疑问:
SELECT stringa FROM table WHERE stringb = 'x' OR stringb = 'y' OR stringb = 'z'
这只是一个简短的版本,实际的查询在一个查询中有超过1000个“OR”子句。
执行需要几分钟,这不好。
我试着一次只做一个查询,就像这样:
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'
但这又花了更长的时间。
如果有人有任何提高绩效的建议,将不胜感激。如果重要的话,我的桌子是米萨姆。
编辑:
这是表格的结构:
柱:
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或b或c,等等。
当然,stringa和stringb不仅仅是'a'和'b',它们包含长度在3-80个字符之间的字符。
我希望这对你有所帮助
最佳答案
首先,将列数据类型更改为varchar
。尽管您可能听说过char
被认为是更快的,但折衷的办法是节省一点CPU来大幅增加I/O(这是一个非常糟糕的交易)。
第二,如果列stringb
还没有索引,则需要它的索引。索引不必是唯一的。
第三,许多数据库管理系统对成千上万个或多个条件都没有问题,尽管通常这样的东西被表示为WHERE stringb IN ('a', 'b', 'c', 'd', 'e' ...)
。
最后,在许多情况下,如果JOIN不能提供更高的性能(尽管在某些dbms或情况下是可能的),那么它至少可以提供更高的清晰度和重用性。例如,许多人做的一件事是创建一个字符串拆分函数,当传递一个格式为'a,b,c,d,e'
的字符串时,该函数返回一个行集,其中包含单独行中的每个项。加入这个行集很容易,只要客户机可以构造要拆分的字符串,就可以动态地驱动查询。
下面是一种可能的连接方式:
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