MySQL匹配w/附加条件:使用子查询?

MySQL匹配w/附加条件:使用子查询?,mysql,sql,where-clause,database-performance,match-against,Mysql,Sql,Where Clause,Database Performance,Match Against,假设我们有一张像这样的桌子 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”条件吗?还是应该更明确地使用子查询?从代码

假设我们有一张像这样的桌子

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”条件吗?还是应该更明确地使用子查询?

从代码看,匹配表达式将在查询优化阶段进行评估。这意味着在考虑
城市
的条件之前,将识别包含
'xyz'
的所有行。(至少,我对InnoDB的理解是这样的。我不知道在MyISAM中如何实现它的细节。)在查询执行期间,当计算WHERE子句时,表达式从左到右进行计算。(这是当前的实现,在未来的版本中可能会更改。)由于匹配分数已经计算出来,此时只需评估它们是否为非零

如果您的
city
列已编制索引,查询优化器可能会选择使用此索引仅扫描给定城市中的行,并仅比较这些行的匹配分数。但是,包含
'xyz'
的所有行仍然首先被标识。查询的解释输出将显示是否使用了索引


我怀疑使用子查询是否有任何帮助。如果子查询是相关的,您甚至可能会面临全文搜索被执行多次的风险。

查看代码后,匹配表达式将在查询优化阶段进行评估。这意味着在考虑
城市
的条件之前,将识别包含
'xyz'
的所有行。(至少,我对InnoDB的理解是这样的。我不知道在MyISAM中如何实现它的细节。)在查询执行期间,当计算WHERE子句时,表达式从左到右进行计算。(这是当前的实现,在未来的版本中可能会更改。)由于匹配分数已经计算出来,此时只需评估它们是否为非零

如果您的
city
列已编制索引,查询优化器可能会选择使用此索引仅扫描给定城市中的行,并仅比较这些行的匹配分数。但是,包含
'xyz'
的所有行仍然首先被标识。查询的解释输出将显示是否使用了索引


我怀疑使用子查询是否有任何帮助。如果子查询是相关的,您甚至可能面临全文搜索被执行多次的风险。

这取决于索引和统计信息。。要查看MySQL实际选择了什么。Wrt多个索引:;根据真实性估计,查询计划员仍可能选择不使用[附加]索引。这就是为什么查看实际查询计划(随着时间的推移可能会发生变化!)非常重要的原因。有关一些注意事项,请参阅。可能是个傻瓜。还有一个问题……无论如何,回到标题:子查询不太可能是更有效的查询。非依赖子查询在逻辑上无论如何都是“展开”的。如果这以某种方式触发查询计划器中的行为更改,则YMMV将打开。请参见第一条注释。请提供所述查询的
EXPLAIN SELECT
,并替换
子句。(粘贴的文本版本就足够了。)这取决于索引和统计数据。。要查看MySQL实际选择了什么。Wrt多个索引:;根据真实性估计,查询计划员仍可能选择不使用[附加]索引。这就是为什么查看实际查询计划(随着时间的推移可能会发生变化!)非常重要的原因。有关一些注意事项,请参阅。可能是个傻瓜。还有一个问题……无论如何,回到标题:子查询不太可能是更有效的查询。非依赖子查询在逻辑上无论如何都是“展开”的。如果这以某种方式触发查询计划器中的行为更改,则YMMV将打开。请参见第一条注释。请提供所述查询的
EXPLAIN SELECT
,并替换
子句。(粘贴的文本版本就足够了。)因此,如果比赛前将
city
放在左侧,可能会有优势?我不确定这个解释,但另一个条件确实被索引了。解释将其标识为“可能的密钥”。嗯。。。我一直认为(1)
WHERE
中的顺序无关紧要(极端情况除外,如子查询),以及(2)
MATCH
总是首先执行。(我想MyISAM说它会先发生。)将城市放在第一位只会带来一点小的改进,因为大多数比赛的“重担”都已经在查询优化过程中完成。所以如果在比赛之前将城市放在左边,可能会有优势?我不确定这个解释,但另一个条件确实被索引了。解释将其标识为“可能的密钥”。嗯。。。我一直认为(1)
WHERE
中的顺序无关紧要(极端情况除外,如子查询),以及(2)
MATCH
总是首先执行。(我认为MyISAM说它会首先发生。)将城市放在首位只会带来一点小的改进,因为大多数比赛的“重担”都已经在查询优化过程中完成了。