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

sql查询搜索到两个表,性能问题,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

我有两个表(我只列出要搜索的字段)

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

如果我有一个搜索值“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` 
但是,如果我尝试加入这两个查询,则需要花费很长时间

我的问题

  • 根据两个表的搜索结果,获取ID-s列表,这是我在这里需要做的最好的方法

  • 如何更改以提高详细信息表中的搜索性能,我知道%..%并不快,但我也需要部分匹配

  • 编辑(基于答案)

    它返回由搜索值过滤的两个表中的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` 
    

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

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

    如果两个查询都按您的意愿运行,只需将结果合并在一起。这比在无法有效使用索引的查询中使用“或”要快得多,还允许您删除同一语句中的重复项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