MySQL sql 无法自动谓词推入

mysql 版本 5.6.16:

优化前:

[email protected] jd_credit 03:41:23>SELECT aaa.POP_VENDER_ACC_ID as accId, sum(aaa.aa1) as TC

->   FROM (SELECT a.POP_VENDER_ACC_ID,

->                a.POP_VENDER_NAME,

->                a.license_no,

->                (CASE

->                  WHEN a.POP_VENDER_NAME = b.POP_VENDER_NAME OR

->                       a.license_no = b.license_no THEN

->                   b.totalPRINCIPAL

->                  ELSE

->                   0

->                END) aa1

->           FROM a_01_pop_info a

->           JOIN (SELECT t.POP_VENDER_NAME,

->                       t.license_no,

->                       t.POP_VENDER_ACC_ID,

->                       SUM(t1.REST_PRINCIPAL) AS totalPRINCIPAL

->                  FROM a_01_pop_info t, A_01_POP_LOAN_INFO t1

->                 WHERE t.POP_VENDER_ACC_ID = t1.POP_VENDER_ACC_ID

->                   AND t1. STATUS = ‘1‘

->                 GROUP BY t.POP_VENDER_ACC_ID,

->                          t.POP_VENDER_NAME,

->                          t.license_no) b ON 1 = 1) aaa

->  where aaa.POP_VENDER_ACC_ID = ‘40367‘

->  GROUP BY aaa.POP_VENDER_ACC_ID;

+-------+----------+

| accId | TC       |

+-------+----------+

| 40367 | 34817.30 |

+-------+----------+

1 row in set (9.64 sec)

优化后:

[email protected] jd_credit 03:41:16>SELECT aaa.POP_VENDER_ACC_ID as accId, sum(aaa.aa1) as TC

->   FROM (SELECT a.POP_VENDER_ACC_ID,

->                a.POP_VENDER_NAME,

->                a.license_no,

->                (CASE

->                  WHEN a.POP_VENDER_NAME = b.POP_VENDER_NAME OR

->                       a.license_no = b.license_no THEN

->                   b.totalPRINCIPAL

->                  ELSE

->                   0

->                END) aa1

->           FROM a_01_pop_info a

->           JOIN (SELECT t.POP_VENDER_NAME,

->                       t.license_no,

->                       t.POP_VENDER_ACC_ID,

->                       SUM(t1.REST_PRINCIPAL) AS totalPRINCIPAL

->                  FROM a_01_pop_info t, A_01_POP_LOAN_INFO t1

->                 WHERE t.POP_VENDER_ACC_ID = t1.POP_VENDER_ACC_ID

->                   AND t1. STATUS = ‘1‘

->                 GROUP BY t.POP_VENDER_ACC_ID,

->                          t.POP_VENDER_NAME,

->                          t.license_no) b ON 1 = 1

->          where a.POP_VENDER_ACC_ID = ‘40367‘) aaa

->  GROUP BY aaa.POP_VENDER_ACC_ID

-> ;

+-------+----------+

| accId | TC       |

+-------+----------+

| 40367 | 34817.30 |

+-------+----------+

1 row in set (0.00 sec)

.从目前的版本5.6.16 MySQL 并没有自动做谓词推入,Oracle 8i开始这方面自动就谓词推入,减少优化的工作量,希望MySQL 能尽早实现谓词推入功能。

时间: 2024-10-23 20:51:19

MySQL sql 无法自动谓词推入的相关文章

Oracle查询转换之连接谓词推入

连接谓词推入(Join Predicate  Pushdown)是优化器处理带视图的目标SQL的一种优化手段,它是指虽然优化器会把该SQL中视图的定义SQL语句当作一个独立单元来单独执行,但此时优化器会把原本处于该视图外部查询中和该视图之间的连接条件推入到该视图的定义SQL语句内部,这样是为了能使用上该视图内部相关基表上的索引,进而能走出基于索引的嵌套循环连接. 连接谓词推入所带来的基于索引的嵌套循环连接并不一定能走出更高效的执行计划,因为当做了连接谓词推入后,原目标SQL中的视图就和外部查询产

谓词推入

--Join Predicate Pushdowncreate table emp1 as select * from scott.emp create table emp2 as select * from scott.emp create index idx_emp1 on emp1(empno); create index idx_emp2 on emp2(empno); create or replace view emp_view as select emp1.empno as emp

重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB

重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的.不了解数据库的有所帮助. 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者

mysql sql优化之expain

explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 1. id SELECT识别符.这是SELECT查询序列号.查询序号即为sql语句执行的顺序 2.select_type select类型,它有以下几种值 2.1 simple 它表示简单的select,没有union和子查询 2.2 primary 最外面的select,在有子查询的语句中,最外面的select查询就是primary,上图中就是这样 2.3 union  

Mysql SQL Mode简介

MySQL服务器能够工作在不同的SQL模式下,并能针对不同的客户端以不同的方式应用这些模式.这样,应用程序就能对服务器操作进行量身定制以满足自己的需求.这类模式定义了MySQL应支持的SQL语法,以及应该在数据上执行何种确认检查.这样,就能在众多不同的环境下.与其他数据库服务器一起更容易地使用MySQL.可以使用“--sql-mode="modes"”选项,通过启动mysqld来设置默认的SQL模式.从MySQL 4.1开始,也能在启动之后,使用SET [SESSION|GLOBAL]

Hibernate连接mysql数据库并自动创建表

天才第一步,雀氏纸尿裤,Hibernate第一步,连接数据库. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. 所以说,Hibernate讲白了就是简化了与数据库之间的操作,那么要玩转它自然就得连接上数据库咯.(与Hibernate对应的orm框架还有Mybatis,只不过M

jquery autocomplete实现读取sql数据库自动补全TextBox

项目需要这样子一个功能,其他部门提的意见,只好去实现了哦,搞了好久才弄出来,分享一下. 1.前台页面 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transiti

MySql Windws 下自动备份脚本

这几天正在做一个  使用MySQL数据库的项目,目前项目已经完成了,当部署好项目之后,正在考虑如何自动备份MySql数据库的问题,我在网上找了一下资料终于解决了,特此记录一下. 1 @echo off 2 echo. 3 echo MySQL数据库备份 4 5 echo ***************************** 6 echo. 7 echo 今天是 %date% 8 echo 时间是 %time% 9 echo. 10 echo ************************

MySQL主键自动生成和生成器表以及JPA主键映射

MySQL主键自动生成 表设计 MySQL有许多主键生成策略,其中很常见的一种是自动生成.一般情况下,主键类型是BIGINT UNSIGNED,自动生成主键的关键词是AUTO_INCREMENT. CREATE TABLE Stock ( id BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, NO VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, price DECIMAL(6,2) N