假设我们有一个表,例如
CREATE TABLE test{
title VARCHAR(32),
city VARCHAR(32),
description TEXT
...
在查询中说我们有
SELECT * FROM test WHERE MATCH(title, description) AGAINST('xyz' IN NATURAL LANGUAGE MODE) AND city = 'ABC';
MySQL会知道首先使用"city"条件,还是我们应该更明确地使用子查询?
通过查看代码,MATCH 表达式将在查询优化阶段进行评估。 这意味着在考虑条件 oncity
之前,将标识包含'xyz'
的所有行。(至少,这是我对InnoDB工作的理解。 我不知道如何在MyISAM中实现这一点的细节。 在查询执行期间,计算 WHERE 子句时,表达式将从左到右计算。(这是当前的实现,可能会在将来的版本中更改。 由于已经计算了 MATCH 分数,此时只需评估它们是否不为零。
如果city
列已编制索引,则查询优化器可能会选择使用此索引仅扫描给定城市的行,并仅比较这些行的 MATCH 分数。 但是,仍首先标识包含'xyz'
的所有行。 查询的 EXPLAIN 输出将显示是否使用了索引。
我怀疑使用子查询会有所帮助。 如果子查询是相关的,您甚至可能面临多次执行全文搜索的风险。