MYSQL查询速度更快

时间:2016-03-21 04:28:11

标签: mysql performance

如何更快地进行此查询?它只是一种选择可以输入varchar文本的字段的方法。

    SELECT
        F.field_name,
        FI.farmer_name,
        FI.lname_farmer,
        FI.farmer_email,
        FI.farmer_group,
        L.first_name,
        L.last_name,
        L.email,
        EI.extension_name,
        EI.lname_ext,
        EI.other_prof,
        EI.extension_name
    FROM
        anReference AS R
    INNER JOIN anFieldInfo AS F ON R.ref_id = F.ref_id
    INNER JOIN anFarmerInfo AS FI ON F.ref_id = R.ref_id
    INNER JOIN anCropInfo AS C ON C.ref_id = R.ref_id
    INNER JOIN anLocalTechnician AS L ON L.ref_id = R.ref_id
    INNER JOIN anSessionExtension AS SE ON SE.ref_id = R.ref_id
    INNER JOIN anExtensionInfo AS EI ON EI.extension_id = SE.extension_id
    where   R.date_accessed BETWEEN '2016-03-20 00:00:00'
AND NOW() AND (
            F.field_name LIKE '%test%'
            OR FI.farmer_name LIKE '%test%'
            OR FI.lname_farmer LIKE '%test%'
            OR FI.farmer_email LIKE '%test%'
            OR FI.farmer_group LIKE '%test%'
            OR L.first_name LIKE '%test%'
            OR L.last_name LIKE '%test%'
            OR L.email LIKE '%test%'
            OR EI.extension_name LIKE '%test%'
            OR EI.lname_ext LIKE '%test%'
            OR EI.other_prof LIKE '%test%'
            OR EI.extension_name LIKE '%test%'
        ) AND r.category = 0;

我已经尝试过使用concat,但效果不大。

2 个答案:

答案 0 :(得分:2)

计划A.在每个表的每组字段上创建一个FULLTEXT索引,然后每个表使用一个MATCH..AGAINST进行文本搜索。但是,由于这些内容分散在4个表中,因此UNION为4 SELECTs,每个表都有一个MATCH。警告:它仅适用于“单词”,并有其他限制。请提供SHOW CREATE TABLE;没有它,我做的不仅仅是“挥手”。

以下是解决问题的方法:考虑如何编写SELECT来测试仅1个表的字段,然后执行所有JOINing以获得所需的结果。重复其他3个表。然后UNION DISTINCT 4 SELECTs在一起。

计划B:使用单列中所有这些字段的CONCAT构建另一个表;搜索该表。

计划C:更改用户界面。

计划D:计划A 中描述的UNION可能更快一点,即使有可怕的LIKE '%text%'。这是因为临时表可以减少挖掘。

计划A会更快,但警告可能会阻止使用它。 B计划的速度不会太快。

VIEW我们的句法糖;不是表演助推器。

答案 1 :(得分:0)

请创建一个视图对于您的上述查询,使用视图获取数据的速度比当前查询更快。

相关问题