sql语句中where条件的嵌套子查询性能

嵌套查询执行次数 = table1 中的行数和 table2 中非空 ID 的数量。
1 万次,表示表1 有1 0行,表2 有K个非空ID。
效率低,全表扫描。

Elasticsearch中如何正确嵌套should和must查询以实现复杂的SQL查询逻辑?

嘿,我们来谈谈 Elasticsearch 中查询逻辑的转换。
这件事就像将复杂的 SQL 翻译成 Elasticsearch 查询语言一样,这非常酷。

首先你要知道SQL中的OR与Elasticsearch的should匹配,也就是说只要满足should中的任意一个条件,文档就是OK的。
例如,SQL中的“sex=1 OR sex=2 ”在Elasticsearch中应该用嵌套的should来表示,并且在每个should中插入一个术语查询。

所以,SQL中的AND对应于Elasticsearch的must,即文档必须同时满足must中的所有条件。
例如“(sex=1 OR sex=2 ) AND (color=2 2 6 OR color=2 2 9 )”,在Elasticsearch中,需要在外层使用must来连接两个嵌套的should bool查询。

让我们举一个说明性的例子。
例如,原来的SQL查询是这样写的:
sql 从表中选择 WHERE ((sex=1 OR sex=2 ) AND (color=2 2 6 OR color=2 2 9 )) OR ((sex=0 OR sex=3 ) AND (color=2 2 6 ))
转换为Elasticsearch的DSL是:
json { “问题”:{ “布尔”:{ “应该”:[ { “布尔”:{ “必须”:[ { “布尔”:{ “应该”:[ {“术语”:{“性别”:1 }}, {“术语”:{“性别”:2 }} ] } }, { “布尔”:{ “应该”:[ {“术语”:{“颜色”:2 2 6 }}, {“术语”:{“颜色”:2 2 9 }} ] } } ] } }, { “布尔”:{ “必须”:[ { “布尔”:{ “应该”:[ {“术语”:{“性别”:0}}, {“术语”:{“性别”:3 }} ] } }, {“术语”:{“颜色”:2 2 6 }} ] } } ] } }, “尺寸”:2
你看,这里的外层bool对应的是SQL的顶层OR,而嵌套的bool应该对应的是SQL中的AND和OR逻辑。

但是,转换过程中也会遇到一些陷阱。
例如,必须有人直接嵌套在里面,这是错误的。
正确的方法是将 Should 和 Must 用 bool 括起来。

再举个例子,有时候嵌套层次是错误的,逻辑变得混乱。
应该注意的是,每个条件必须明确地与“必须”或“应该”分组。

有时您需要处理一些扩​​展场景,例如排除某些文档或使用过滤器组合进行过滤。

为了性能优化,可以减少嵌套深度,使用Constant_score简化逻辑,设置Minimum_Should_match指定最小匹配数。
还应该优化字段映射,例如将性别和颜色字段设置为关键字类型或整数类型。

总之,这个东西相当复杂,但是如果掌握了这些方法,就可以更有效地进行查询转换。
说实话,当时我并没有想到能理解这么复杂的东西,但是慢慢摸索之后就明白了。