sql查询搜索成两个表,性能问题

时间:2014-02-25 18:07:42

标签: sql sqlperformance qsqlquery

我有两张桌子(我只会列出我要搜索的字段)

MySQL版本:5.0.96-community

Table 1: Clients (860 rows)
ID_CLIENT (varcahar 10)
ClientName (text)

Table 2: Details (22380 rows)
ID_CLIENT (varchar 10)
Details (varchar 1000)

Details表可以有来自同一客户端的多行。

我需要搜索这两个表并检索与搜索值匹配的客户ID。

如果我的搜索值为“蓝色”,则必须匹配CLientName(来自Blue berries Corp)或第二个表中的Details(例如“它有一个blue徽标)

结果应该是符合条件的客户ID的列表。

如果我对一个表进行查询,则需要一段时间

#0.002 sec
select a.`ID_CLIENT` from clienti a
where 
a.`ClientName` LIKE '%blue%' 


#0.1 sec
SELECT b.`ID_CLIENT` FROM Details b
WHERE b.`Details` LIKE  '%blue%'
GROUP BY b.`GUID_CLIENT` 

但如果我尝试加入这两个查询,则需要很长时间。

我的问题

  1. 根据两个表格的搜索结果得到ID-s列表的最佳方式是什么?

  2. 为了提高详细信息表格中的搜索效果,我知道%..%不是很快,但我也需要部分匹配。

  3. 编辑(根据答案)

    #~0.2 sec
    (SELECT a.`ID_CLIENT` FROM `clienti` a  where a.`ClientName` like '%blue%')  
    union
    (SELECT distinct b.`ID_CLIENT` FROM `Details` b where b.`Details` like '%blue%')
    

    它返回搜索值过滤的两个表中的ID列表。

    编辑2:最终查询

    使用那个id列表,我可以过滤客户端表,只根据他们的id获取两个表中的客户端

    select cl.`ID_CLIENT`, `ClientName`, `OtherField`
    from clients cl 
    join 
    ((SELECT a.`ID_CLIENT` FROM `clients` a  where a.`ClientName` like '%blue%')
    union
    (SELECT distinct b.`ID_Client` FROM `Details` b where b.`Detail` like '%blue%' )) rez 
    on cl.`ID_CLIENT` = rez.`ID_CLIENT` 
    

3 个答案:

答案 0 :(得分:1)

如果两个查询都按您的意愿运行,只需将结果合并在一起即可。这比无法有效使用索引的查询上的'或'要快得多,它还允许您在同一语句中删除重复项。

答案 1 :(得分:1)

Divide et impera:创建两个子查询。

在第一个子查询中,左边连接客户端,其详细信息基于client_id,过滤行值,其中客户端名称为'%xxxxx%'

然后是另一个子查询,左边连接客户端的详细信息(但在输出投影中保持相同的字段顺序),过滤详细信息文本字段。然后从两个子查询创建一个联合查询,最后从此联合

创建一个select distinct *

最终架构:

从(subquery1 union subquery2)

中选择distinct *

这似乎是一个非常缓慢而愚蠢的手动查询计划优化",只是尝试一下,让我们知道它有效!

答案 2 :(得分:1)

如果您的两个查询有效,请使用union

select a.`ID_CLIENT`
from clienti a
where  a.`ClientName` LIKE '%blue%' 
union
SELECT b.`ID_CLIENT`
FROM Details b
WHERE b.`Details` LIKE '%blue%';

union会删除所有重复项,因此您不需要单独的group by查询。

为什么这两个表的两个搜索字符串不同?问题建议在两者中搜索blue

如果个人查询效果不佳,您可能需要切换到全文索引。