我有这样的疑问:

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

07-26 06:09