我正在开发一个web应用程序,该应用程序有一个列表框,其中包含来自MySQL数据库('Table1')的数千条记录。
- 我有一个快速搜索字段,搜索与OR的所有字段操作符(值:aaaa).
- 我有一个对话框,允许过滤所有字段与AND
这个想法是创建一个同时包含过滤值和搜索值的查询。我在FROM子句上创建了一个子查询,如下所示:
SELECT b.*
FROM
( SELECT *
FROM Table1
WHERE Field1 LIKE '%xxx%'
AND Field2 LIKE '%yyy%'
AND Field3 LIKE '%zzz%'
) b
WHERE b.Field1 LIKE '%aaaa%'
OR b.Field2 LIKE '%aaaa%'
OR b.Field3 LIKE '%aaaa%'
运行子查询后,我觉得性能不是最优的。
是否有可能以某种方式改进查询以优化性能(并降低响应时间)?非常感谢。
Wardiam
更新:
在我看来,使用公共表表达式(CTE)会更正确。我使用了这个CTE表达式:
WITH CTE_Expression AS
(SELECT *
FROM Table1
WHERE Field1 LIKE '%xxx%'
AND Field2 LIKE '%yyy%'
AND Field3 LIKE '%zzz%'
)
SELECT b.*
FROM CTE_Expression b
WHERE b.Field1 LIKE '%aaaa%'
OR b.Field2 LIKE '%aaaa%'
OR b.Field3 LIKE '%aaaa%'
你觉得怎么样?
发现类似问题:
Mysql使用通配符(%%)提高搜索性能
不,因为MySQL将无法使用索引,当你有一个先导通配符。如果你把你的LIKE改成"aaaa%",那么它就会能够使用索引
如果要检查索引是否被使用,请使用EXPLAIN:
检查执行计划。https://dev.mysql.com/doc/refman/8.0/en/using-explain.html
或者尝试使用MYSQL全文索引MATCH()/AGAINST()。以下是一些关于:
https://severalnines.com/database-blog/full-text-searches-mysql-good-bad-and-uglyhttps://www.w3resource.com/mysql/mysql-full-text-search-functions.php
编辑:经过一番调查,我得出的结论是,前导通配符不可能利用Table索引
通配符搜索MySQL全文搜索https://blog.monyog.com/problem-queries-are-killing-your-database-performance/