如何更快地进行此查询?它只是一种选择可以输入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,但效果不大。
答案 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)
请创建一个视图对于您的上述查询,使用视图获取数据的速度比当前查询更快。