like查询的优化

bqjvbblv  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(377)

快一点question:-
下面的查询可以进一步优化吗?

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%'
    )

有什么建议吗?

kqlmhetl

kqlmhetl1#

like只使用通配符,而且不是很强大。
全文允许更复杂的搜索,包括and,or,not,甚至类似的搜索结果(soundex)和更多的项目。
我开始研究freetext()和相关的全文搜索项目,以帮助更好地了解可用的内容。
好的,请执行以下步骤并尝试查询,我在0.008秒内运行了它。
步骤1:启用列的全文:名、姓和地址。
步骤2:使用match和against修改查询的where条件。
步骤3:向查询中添加like条件。
将列添加到全文索引后,用户和应用程序可以对列中的文本运行全文查询。这些查询可以搜索以下任一项:
一个或多个特定单词或短语(简单术语)
以特定文本(前缀词)开头的词或短语
特定单词的屈折形式(代词)
与另一个词或短语相近的词或短语(近义词)
特定单词的同义形式(同义词库)
使用加权值的单词或短语(加权项)
参考文献:https://docs.microsoft.com/en-us/sql/relational-databases/search/full-text-search?view=sql-server-2017

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 predicate 进行比较
与全文搜索不同,like transact-sql predicate 只对字符模式起作用。此外,不能使用like predicate 查询格式化的二进制数据。此外,针对大量非结构化文本数据的like查询要比针对相同数据的等效全文查询慢得多。对数百万行文本数据的类似查询可能需要几分钟才能返回;而根据返回的行数,对同一数据进行全文查询只需几秒钟或更短的时间。
哪一个比全文快?根据我的经验,喜欢可以比全文快得多。所以,在您的案例中,我单独使用了特定列的全文。

相关问题