ノート:
私が考えたように、実際の問題は、私がタグ ID に使用している IN 句が原因です。テキスト検索のクエリの一部を変更しても、あまり役に立ちませんでした。クエリを改善する方法はありますか?
サーバーでの実行中にクエリに時間がかかりすぎます。ここで Partha S はユーザーが入力した検索項目です。テーブルの連絡先には個人情報が含まれ、タグにはカテゴリ名と ID が含まれます。また、contacts2tags テーブルには contactid と tagid が含まれており、値はそれぞれ contact と 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 演算子を削除し、後者の場合は LIKE の代わりに MATCH(..) AGAINST(..) を使用しました。最初の変更でパフォーマンスが少し向上しましたが、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