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条。
客户基本上想要它,以便他们可以搜索帐户名称,比如'test'。它会显示促销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上有单个索引
注意:这是用户可能无法按帐户搜索的查询的一部分。 I.E where子句可能并不总是存在
答案 0 :(得分:1)
使用INNER 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%";
答案 1 :(得分: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%"
)