笔记:
所以正如我所想,真正的问题是因为我用于标记的 IN 子句。更改文本搜索的查询部分并没有太大帮助。知道如何改进查询吗?
查询在服务器上运行时耗时过长。这里 Partha S 是用户输入的搜索项。表contacts包含个人信息,tags包含类别名称和id;并且contacts2tags 表包含contactid 和tagid,其值分别类似于contacts 和tags 中的id。
SELECT *
FROM
(
SELECT *,
IF
(
first_name LIKE 'Partha S'
OR last_name LIKE 'Partha S'
OR phone_number LIKE 'Partha S'
OR mobile_number LIKE 'Partha S'
OR email_address LIKE 'Partha S'
OR address LIKE 'Partha S'
OR organization LIKE 'Partha S'
OR other LIKE 'Partha S'
OR sector LIKE 'Partha S'
OR designation LIKE 'Partha S'
OR concat ( first_name, ' ', last_name ) LIKE 'Partha S'
OR concat ( last_name, ' ', first_name ) LIKE 'Partha S',
1,
0 )
as exact,
IF
(
(
first_name LIKE '%Partha%'
OR last_name LIKE '%Partha%'
OR phone_number LIKE '%Partha%'
OR mobile_number LIKE '%Partha%'
OR email_address LIKE '%Partha%'
OR address LIKE '%Partha%'
OR organization LIKE '%Partha%'
OR other LIKE '%Partha%'
OR sector LIKE '%Partha%'
OR designation LIKE '%Partha%' )
AND
(
first_name LIKE '%S%'
OR last_name LIKE '%S%'
OR phone_number LIKE '%S%'
OR mobile_number LIKE '%S%'
OR email_address LIKE '%S%'
OR address LIKE '%S%'
OR organization LIKE '%S%'
OR other LIKE '%S%'
OR sector LIKE '%S%'
OR designation LIKE '%S%' )
,
1,
0 )
as normal
FROM contacts
WHERE id in
(
SELECT DISTINCT contacts.id
from contacts INNER
JOIN contacts2tags ON contacts.id = contacts2tags.contactid
WHERE ( tagid in ( 178 ) ) )
)
d
WHERE exact = 1
OR normal = 1
ORDER BY exact desc,
last_name asc LIMIT 0,
20
更新: 根据建议,我删除了 LIKE 运算符以进行精确搜索,并在后一种情况下使用 MATCH(..) AGAINST(..) 而不是 LIKE 。虽然第一个更改确实提高了一点性能,但使用 MATCH() AGAINST() 并没有令人惊讶地改变执行时间。这是更新的查询。PS 我尝试将 MATCH(all cols) AGAINST(search item) 和 MATCH(single cols) AGAINST (search item) 与 OR 结合使用。请建议。谢谢
SELECT *
FROM
(
SELECT *,
IF
(
first_name ='Partha S'
OR last_name ='Partha S'
OR phone_number ='Partha S'
OR mobile_number ='Partha S'
OR email_address = 'Partha S'
OR address ='Partha S'
OR organization ='Partha S'
OR other ='Partha S'
OR sector ='Partha S'
OR designation ='Partha S'
OR concat ( first_name, ' ', last_name ) ='Partha S'
OR concat ( last_name, ' ', first_name ) ='Partha S',
1,
0 )
as exact,
IF
( match(first_name,last_name,phone_number,mobile_number,email_address, address,organization,other,sector,designation) against( 'Partha')
OR match(first_name,last_name,phone_number,mobile_number,email_address,address,organization,other,sector,designation) against( 'S')
,
1,
0 )
as normal
FROM contacts
WHERE id in
(
SELECT DISTINCT contacts.id
from contacts INNER
JOIN contacts2tags ON contacts.id = contacts2tags.contactid
WHERE ( tagid in ( 178 ) ) )
)
d
WHERE exact = 1
OR normal = 1
ORDER BY exact desc,
last_name asc LIMIT 0,
20