0
account
act_id | act_name | grp_id  | grp_id_2
2      | test     |      4  | 10

promotion
pml_id | act_id   | grp_id 
2      | 2        | null
3      | null     | 4
4      | null     | 10

我有两张表,如上图所示(修剪)。账户记录约15000条,推广约20000条。

客户基本上想要它,以便他们可以搜索帐户名称,例如“测试”。它会显示促销 2、3 和 4。

促销 3 会显示,因为帐户 'test' 的 grp_id = 4。

促销 4 将显示,因为帐户 'test' 的 grp_id_2 = 10。

我最初是通过几个连接来做到这一点的

SELECT pml_id FROM promotion 
    LEFT JOIN account AS account1 ON promotion.act_id = account1.act_id
    LEFT JOIN account AS account2 ON promotion.grp_id = account2.grp_id
    LEFT JOIN account AS account3 ON promotion.grp_id = account3.grp_id_2
WHERE account1.act_name LIKE 'test%' or account2.act_name LIKE 'test%' 
      or account3.act_name LIKE  'test%'
GROUP BY pml_id

问题是当我开始不得不加入 5 次帐户表时,这最终花费了很长时间。它还给了我大约 10000000 条记录(没有分组依据)。大多数促销活动使用 grp_id,很少使用 act_id。

在这种情况下,有什么方法可以快速搜索 act_name 列?不必做这么多的连接?

我在 act_id、pml_id、grp_id、grp_id_2 上有单个索引

注意:这是用户不能按帐户搜索的查询的一部分。IE where 子句可能并不总是存在

4

2 回答 2

1

使用 anINNER JOIN来避免扫描整个表:

SELECT p.pml_id 
FROM account a
INNER JOIN promotion p
  ON (p.act_id = a.act_id OR p.grp_id = a.grp_id OR p.grp_id = a.grp_id_2)
WHERE a.act_name LIKE "test%";
于 2013-09-13T03:51:47.233 回答
0

这是不是更快?

SELECT pml_id FROM promotion p
  LEFT JOIN account a
  ON (p.act_id = a.act_id OR p.grp_id = a.grp_id OR p.grp_id = a.grp_id_2)
WHERE a.act_name LIKE "test%";

也试试这个,如果你在 act_id 上有一个索引,这应该会快一点:

SELECT * FROM promotion p
LEFT JOIN account a
  ON (p.act_id = a.act_id OR p.grp_id = a.grp_id OR p.grp_id = a.grp_id_2)
WHERE a.act_id IN (
    SELECT act_id FROM account WHERE act_name LIKE "test%"
)
于 2013-09-13T03:20:24.897 回答