mysql - Like查询优化
问题描述
一个快速的问题:-
可以进一步优化以下查询吗?
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%'
)
有什么建议么?
解决方案
Like 只使用通配符,并没有那么强大。
全文允许更复杂的搜索,包括 And、Or、Not,甚至类似的声音结果 (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 单独用于特定列。
推荐阅读
- python - Numpy:对多个数组进行花式索引
- java - 使用多个片段的最佳方式是什么?
- css - class="modal-dialog" style="padding-top: 20px; !important" - 没用
- javascript - 数据表行组显示条件?
- vue.js - 如何从 Vuex 的另一家商店调用 getter?
- java - CLASSPATH 问题
- php - 通过 ajax 将变量传递给外部 php 文件,然后将其插入 mysql 数据库
- node.js - 节点中的子进程缺少信息
- javascript - 使用 redux 反应导航
- mysql - 使用 spring 数据写入简约数据库时出错