sql查询搜索到两个表,性能问题
我有两个表(我只列出要搜索的字段) MySQL版本:5.0.96-communitysql查询搜索到两个表,性能问题,sql,sqlperformance,qsqlquery,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 如果我有一个搜索值“bl
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
如果我有一个搜索值“blue”,它必须匹配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`
但是,如果我尝试加入这两个查询,则需要花费很长时间
我的问题
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`
如果两个查询都按您的意愿运行,只需将结果合并在一起即可。对于无法有效使用索引的查询,这比“或”快得多,还允许您删除同一语句中的重复项。如果两个查询都按您的意愿运行,只需将结果合并在一起即可。这比“或”快得多在无法有效使用索引的查询中,它还允许您删除同一语句中的重复项。如果两个查询都按您的意愿运行,只需将结果合并在一起。这比在无法有效使用索引的查询中使用“或”要快得多,还允许您删除同一语句中的重复项nt.如果两个查询都按您的意愿运行,只需将结果合并在一起。这比在无法有效使用索引的查询上使用“或”要快得多,还可以让您删除同一语句中的重复项。分割et impera:创建两个子查询 在第一个子查询中,左键根据客户机\u id使用详细信息连接客户机,并根据clientname(如“%xxxxx%”)所在的行值进行筛选 然后是另一个子查询,左连接客户机的详细信息(但在输出投影中保持字段的相同顺序),过滤详细信息文本字段。然后从两个子查询创建联合查询,最后从该联合创建一个select distinct* 最终模式: 选择distinct*from(子查询1联合子查询2)
这似乎是一个非常缓慢和愚蠢的“手动查询计划优化”,请尝试一下,让我们知道它是有效的!Divide et impera:创建两个子查询 在第一个子查询中,左键根据客户机\u id使用详细信息连接客户机,并根据clientname(如“%xxxxx%”)所在的行值进行筛选 然后是另一个子查询,左连接客户机的详细信息(但在输出投影中保持字段的相同顺序),过滤详细信息文本字段。然后从两个子查询创建联合查询,最后从该联合创建一个select distinct* 最终模式: 选择distinct*from(子查询1联合子查询2)
这似乎是一个非常缓慢和愚蠢的“手动查询计划优化”,请尝试一下,让我们知道它是有效的!Divide et impera:创建两个子查询 在第一个子查询中,左键根据客户机\u id使用详细信息连接客户机,并根据clientname(如“%xxxxx%”)所在的行值进行筛选 然后是另一个子查询,左连接客户机的详细信息(但在输出投影中保持字段的相同顺序),过滤详细信息文本字段。然后从两个子查询创建联合查询,最后从该联合创建一个select distinct* 最终模式: 选择distinct*from(子查询1联合子查询2)
这似乎是一个非常缓慢和愚蠢的“手动查询计划优化”,请尝试一下,让我们知道它是有效的!Divide et impera:创建两个子查询 在第一个子查询中,左键根据客户机\u id使用详细信息连接客户机,并根据clientname(如“%xxxxx%”)所在的行值进行筛选 然后是另一个子查询,左连接客户机的详细信息(但在输出投影中保持字段的相同顺序),过滤详细信息文本字段。然后从两个子查询创建联合查询,最后从该联合创建一个select distinct* 最终模式: 选择distinct*from(子查询1联合子查询2)
这似乎是一个非常缓慢和愚蠢的“手动查询计划优化”,请尝试一下,让我们知道它是有效的!如果您的两个查询都有效,只需使用
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
将删除所有重复项,因此不需要单独的groupby
查询
为什么这两个表的两个搜索字符串不同?问题是在这两个表中搜索blue
如果单个查询执行得不好,您可能需要切换到全文索引。如果两个查询都有效,只需使用
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
将删除所有重复项,因此不需要单独的groupby
查询
为什么这两个表的两个搜索字符串不同?问题是在这两个表中搜索blue
如果单个查询执行得不好,您可能需要切换到全文索引。如果两个查询都有效,只需使用
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
将删除所有重复项,因此不需要单独的groupby
查询
为什么两个表的两个搜索字符串不同?问题是搜索blue