【问题标题】:MySQL predicate pushingMySQL谓词推送
【发布时间】:2014-10-12 18:20:36
【问题描述】:

有什么方法可以强制 MySQL 将谓词推送到视图中?

例子:

CREATE TABLE t1(
  id INT(11) NOT NULL AUTO_INCREMENT
  PRIMARY KEY (id)
);

CREATE VIEW v1
AS SELECT * FROM t1;

下面的查询不会使用 MySQL 中的 PRIMARY KEY 索引:

SELECT *
FROM v1
WHERE id = 1

相反,它会从 t1 中选择所有内容,创建一个派生表,然后将其过滤掉以获取 id = 1。

有什么办法可以克服吗?

PS:我在现实生活中的例子比上面的例子稍微复杂一点,但为了简单起见,我使用了上面的例子

PPS:这是一个相关的 Stack Overflow 问题:How do I get MySQL to use an INDEX for view query?

【问题讨论】:

  • 子查询似乎也不支持。
  • 实体框架 (MSVS 2014) 生成查询,其中 from 子句实际上是子查询,并且此表单不会发生谓词推送: select * from (select * from someView) sv where x = x;

标签: mysql view indexing


【解决方案1】:

是的,但您必须切换到完全兼容的 MariaDB 10.2.2

这是默认开启的,可以使用optimizer_switch关闭:

SET GLOBAL optimizer_switch='condition_pushdown_for_derived=off'

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 2019-01-21
    • 2019-09-17
    • 2019-06-18
    • 2020-04-16
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多