优化MySQL中FROM子句的子查询



我正在开发一个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/

最新更新