【问题标题】:Which parts of a where are applied in the Storage engine and which in the MySQL?存储引擎中应用了 where 的哪些部分,MySQL 中应用了哪些部分?
【发布时间】:2014-05-27 15:56:29
【问题描述】:

我读到 SQL 由 MySQL 解析,并与存储引擎交互,例如 InnoDB。
似乎以下内容:WHERE some_id < 5 AND some_id <> 1 只有some_id < 5 被传递给存储引擎,而some_id <> 1 在服务器上被过滤。
据我了解,这是因为存储引擎 api 提供了一种方法,仅用于获取索引为“小于”的“某物”以实现范围搜索。
但我无法理解的是为什么 API 也不提供执行范围 AND 排除某些值的选项。
这是底层数据结构的固有限制吗?谁能解释一下?

【问题讨论】:

  • 这是您正在运行的实际查询吗?查询的 and 部分将被执行。 MySQL 不会过滤 where 子句并删除一些查询字符串。我怀疑您的数据不包含some_id = 1
  • @Namphibian: 不是=1,而是<> 1

标签: mysql data-structures indexing innodb b-tree


【解决方案1】:

我认为您所阅读的内容已被 MySQL 5.6 引入的索引条件下推所取代:https://dev.mysql.com/doc/refman/5.6/en/index-condition-pushdown-optimization.html

【讨论】:

  • 来自你的链接:Without ICP, the storage engine traverses the index to locate rows in the base table and returns them to the MySQL server which evaluates the WHERE condition for the rows 那么为什么需要在服务器中完成 WHERE 呢?
  • @Jim 这是访问和过滤谓词或 sargable 和 non-sargable 谓词之间的区别:并非每个WHERE 条件都可以用于访问索引。然后将剩余的WHERE 条件留给服务器(例如,如果它过滤的列不存在于使用的索引中)。
  • 那么在我的示例中,为什么<> 1 不能传递给存储引擎?
  • @Jim 我认为在你的情况下这只是因为 MySQL 在 5.6 之前无法做到这一点。
猜你喜欢
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多