mysql - 为什么 IN() 被视为 O(logN) 操作?

标签 mysql performance optimization query-optimization

进一步研究this question我在《High Performance MySQL(p.219)》一书中发现了以下内容:

... MySQL sorts the values in the IN list and uses a fast binary search to see whether a value is in the list.

它认为这种方法是最佳的,测量列表大小为O(logN),并且这是一种非常好的方法(而不是例如转换为一系列OR 语句)。
但它似乎忽略了列表的排序是O(NlogN),所以结果比做一系列OR更糟糕,这是O(N)
我在这里误解了什么?
需要明确的是,此列表的目标是列表是来自另一个 SELECT

的巨大结果集。

最佳答案

首先,这个语句对于带有子查询的 in 来说是不正确的。为此,要么对数据中的每一行运行子查询(MySQL 5.6 之前的版本),要么使用连接优化。

其次,在使用列表计算 in 的顺序时会发生两件事。您的两个陈述中隐含的是“对于正在处理的每一行”。因此,如果正在处理 R 行,则实际语句是 O(R * logN)O(R*N) where N是列表的大小。

排序列表的创建在编译时发生,并且发生一次。因此,顺序语句为O((R * logN) + N * logN))。我相信假设是 R >> N,所以它主导了表达式。换句话说,因为排序发生一次并且针对每一行查看算法,所以编译工作就消失了。

关于mysql - 为什么 IN() 被视为 O(logN) 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18173765/

相关文章:

c# - Linq 到 SQL : Simple group by generating many SQL queries

php - 关于 session 的登录脚本中未在 php 中设置错误

java - 如何在 Spring 中为每个请求提供一个全局变量?

javascript - jQuery UI Accordion 插件和显示隐藏切换在所有 Accordion div 上激活

java - 启动 Activity 时,应用程序可能在其主线程上做了太多工作

mysql - 行数没有不同

php - 更新数据库中的所有表

c++ - std::tuple 比 std::array 快吗?

python - Keras 分类器的准确度在训练期间稳步上升,然后下降到 0.25(局部最小值?)

optimization - ifort 什么时候使用优化标志?