一个简单的问题:-
能否进一步优化以下查询?
select
x.id, y.first_name,y.last_name, y.unit_no, y.address_1,y.city
from
customers x
INNER JOIN
people y
on x.person_id = y.person_id
WHERE
x.deleted = '0'
AND (
y.city LIKE '%mil%'
OR y.first_name LIKE '%mil%'
OR y.address_1 LIKE '%mil%'
OR y.address_2 LIKE '%mil%'
OR y.phone_number LIKE '%mil%'
)
有什么建议吗?
答案 0 :(得分:2)
Like仅使用通配符,功能不那么强大。
全文允许进行更复杂的搜索,包括“与”,“或”,“不”,甚至相似的发音结果(SOUNDEX)以及更多项目。
我开始查看FREETEXT()和相关的全文搜索项,以帮助您更好地了解可用的内容。
好,请执行以下步骤并尝试查询,我的运行时间为0.008秒。
步骤1:为列启用“全文”:名字,姓氏和地址。
步骤2:使用MATCH和AGAINST修改查询的WHERE条件。
步骤3:将LIKE条件添加到查询中。
在将列添加到全文索引之后,用户和应用程序可以对列中的文本运行全文查询。这些查询可以搜索以下任何内容:
SELECT
CONCAT(x.first_name,' ',x.last_name) AS name, x.phone_number,
x.unit_no, x.address_1, x.city, y.person_id
FROM people y INNER JOIN customers x
ON x.id = y.id
WHERE y.deleted = '0'
AND MATCH(x.first_name) AGAINST ('mark zuker') OR
MATCH(x.last_name) AGAINST ('mark zuker') OR
MATCH(x.address_1) AGAINST ('mark zuker') OR
x.first_name LIKE 'mark zuker%' OR
x.last_name LIKE 'mark zuker%' OR
x.phone_number LIKE '%mark zuker%' OR
x.unit_no LIKE 'mark zuker%' OR
x.address_1 LIKE '%mark zuker%' OR
x.city LIKE '%mark zuker%' LIMIT 0,1500;
将全文搜索查询与LIKE谓词进行比较
与全文搜索相反,LIKE Transact-SQL谓词仅适用于字符模式。同样,您不能使用LIKE谓词来查询格式化的二进制数据。此外,针对大量非结构化文本数据的LIKE查询要比对相同数据的等效全文查询慢得多。针对数百万行文本数据的LIKE查询可能需要几分钟才能返回;而对相同数据进行全文查询仅需几秒钟或更短的时间,具体取决于返回的行数。
LIKE或FULLTEXT中哪个更快?根据我的经验,LIKE可以比FULLTEXT快得多。因此,在您的情况下,我仅对特定列使用了FULLTEXT。