有一个系统从Oracle迁移到MySQL,在Oracle中运行很快,在MySQL基本运行不出来(等了10分钟都无法运行出来),该加的索引都加了,最后用临时表解决问题。

SELECT COUNT(1)

FROM (SELECT a.vendor_id

FROM g_VENDOR a LEFT JOIN g_VENDOR_CONTACT_PERSON b ON a.vendor_id = b.vendor_id) a

LEFT JOIN (SELECT c.vendor_id,

d.vendor_classify_id,

d.vendor_classify_code,

d.vendor_classify_name

FROM g_vendor_classify_link c, ipb_vendor_classify d

WHERE c.vendor_classify_id = d.vendor_classify_id) e ON a.vendor_id =e.vendor_id

LEFT JOIN (SELECT g.object_id,

f.file_name,

f.file_type,

f.state,

f.update_time,

f.file_dir,

h.attachment_type

FROM g_attachment_object_relation g,

g_attachment                 f

LEFT JOIN g_attachment_extend          h

ON f.attachment_id = h.attachment_id

WHERE f.attachment_id = g.attachment_id

AND f.state = 2

AND g.state = 1

AND f.job_type_code = 'g_Vendor_Attachment_File') h ON a.vendor_id = h.object_id;

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

| id | select_type | table      | type   | possible_keys                  | key                            | key_len | ref                  | rows | Extra                                              |

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

|  1 | PRIMARY     | | ALL    | NULL                           | NULL                           | NULL    | NULL                 | 5009 | NULL                                               |

|  1 | PRIMARY     | | ref    |                    |                    | 99      | a.vendor_id          |   10 | NULL                                               |

|  1 | PRIMARY     | | ALL    | NULL                           | NULL                           | NULL    | NULL                 | 2970 | Using where; Using join buffer (Block Nested Loop) |

|  4 | DERIVED     | f          | ALL    | PRIMARY                        | NULL                           | NULL    | NULL                 | 2970 | Using where                                        |

|  4 | DERIVED     | g          | ref    | idx2_g_attachment_object_rel | idx2_g_attachment_object_rel | 98      | f.attachment_id      |    1 | Using where                                        |

|  4 | DERIVED     | h          | ref    | ind_tae_attachment_id          | ind_tae_attachment_id          | 99      | f.attachment_id      |    1 | NULL                                               |

|  3 | DERIVED     | c          | index  | NULL                           | index_vendor_classify          | 198     | NULL                 |  457 | Using where; Using index                           |

|  3 | DERIVED     | d          | eq_ref | PRIMARY                        | PRIMARY                        | 98      | c.vendor_classify_id |    1 | NULL                                               |

|  2 | DERIVED     | a          | index  | NULL                           | ind_sv_VENDOR_SOURCE           | 5       | NULL                 |  131 | Using index                                        |

|  2 | DERIVED     | b          | ref    | ind_svcp_vendor_id             | ind_svcp_vendor_id             | 99      | a.vendor_id          |    1 | Using index                                        |

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

改成如下方式,一共花费6s出来结果: CREATE TEMPORARY TABLE tmp_g_VENDOR(vendor_id VARCHAR(32)); CREATE INDEX ind_tsv_vendor_id ON tmp_g_VENDOR(vendor_id); INSERT INTO tmp_g_VENDOR SELECT a.vendor_id   FROM (SELECT a.vendor_id           FROM g_VENDOR a LEFT JOIN g_VENDOR_CONTACT_PERSON b ON a.vendor_id = b.vendor_id) a   LEFT JOIN (SELECT c.vendor_id,                     d.vendor_classify_id,                     d.vendor_classify_code,                     d.vendor_classify_name                FROM g_vendor_classify_link c, ipb_vendor_classify d               WHERE c.vendor_classify_id = d.vendor_classify_id) e ON a.vendor_id = e.vendor_id;                CREATE TEMPORARY TABLE tmp_attachment_object(object_id VARCHAR(100));   CREATE INDEX ind_tao_object_id ON tmp_attachment_object(object_id);     INSERT INTO tmp_attachment_object SELECT g.object_id                FROM                      g_attachment_object_relation g,                     g_attachment                 f                     LEFT JOIN                     g_attachment_extend          h                     ON f.attachment_id = h.attachment_id               WHERE f.attachment_id = g.attachment_id                 AND f.state = 2                 AND g.state = 1                 AND f.job_type_code = 'g_Vendor_Attachment_File';                        SELECT COUNT(1) FROM tmp_g_VENDOR a LEFT JOIN tmp_attachment_object b ON a.vendor_id = b.object_id;

mysql5.6 临时表_MySQL5.6 运用临时表做SQL优化相关推荐

  1. 系统优化怎么做-SQL优化

    前言 数据库很重要!很重要!很重要! 重要的事情说三遍.所以单独用一篇来讲述SQL怎么优化.不过这里说到一点,不建议在业务代码里写很多复杂业务SQL,基本尽可能的减少 join,子查询 等,也就说尽量 ...

  2. oracle查询数据放入临时表,ORACLE Temporary Tables临时表更适合做插入和查询操作

    1简介 ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables.这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据.当会话退出或者用户提交 ...

  3. oracle临时表空间组,证明临时表空间组在并发session时的作用

    本帖最后由 zcs0237 于 2013-7-16 20:26 编辑 a.感谢对本帖补充.建议.错误更正 b.为节省篇幅,部分输出结果做了精简 c.可按本文先后顺序复制文中代码进程调试 d.测试环境: ...

  4. oracle如何查询临时表空间,Oracle查询临时表空间的占用

    可以使用以下语句查询是哪个session number的哪个sql占用了较大的临时表空间 select inst_id,username,session_num,sql_id,tablespace,s ...

  5. oracle数据存入临时表,oracle中创建临时表步骤

    当前位置:我的异常网» 数据库 » oracle中创建临时表步骤 oracle中创建临时表步骤 www.myexceptions.net  网友分享于:2014-06-08  浏览:4次 oracle ...

  6. oracle临时表动态采样,带临时表的SQL查询语句的优化方法

    [IT168 原创]故障突发:11号上午,收到系统应用人员的反馈:"销售日报"无法查询出结果,已经等待一个小时,屏幕依然是灰的,而以往该报表2分钟内即可出结果,IT部的同事看一下怎 ...

  7. oracle缩减临时表空间,oracle的临时表空间写满磁盘空间解决改问题的步骤

    oracle的临时表空间写满磁盘空间,解决改问题的具体步骤,以下的操作是用数据库的sys超级用户操作 刚开始打算把临时表空间的数据文件重新缩小就好了 执行: SQL> alter databas ...

  8. oracle临时表读,Oracle之临时表详细解读

    临时表,顾名思义,就是临时存储数据的表. 具体讲,用来保存一个会话session的数据,  或者保存在一个事务中需要的数据. 当会话退出或者用户提交commit和回滚rollback事务的时候, 临时 ...

  9. mysql 临时表 主键_MySQL临时表

    MySQL 临时表 MySQL 临时表在我们需要保存一些临时数据时是非常有用的.临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间. 临时表在MySQL 3.23版本中添加,如 ...

最新文章

  1. 开源资产管理系统java_开源资产管理软件 GLPI 9.3.1 部署
  2. np.asarray和np.array、np.nanmean和np.mean、np.diff、
  3. 【BZOJ】2675: Bomb
  4. legend2---开发常用语句
  5. linux nginx搭配https
  6. java scala 混合打包_scala和java混合开发打包
  7. 字节3-1前端面试官自学Vue的正确姿势
  8. 【ESSD技术解读-04】ESSD Auto PL规格,引领IO性能弹性新方向
  9. Qt 翻译文件的加载
  10. HBase数据模型深入剖析-OLAP商业环境实战
  11. ShardingSphere(七) 读写分离配置,实现分库读写操作
  12. Apache 不记录指定文件类型的日志——LAMP环境搭建
  13. CRC校验算法详解及代码实现
  14. 【MATLAB基础】数据作图--imagesc
  15. 进阶项目(4)蜂鸣器程序设计讲解
  16. Nginx配置https及证书
  17. python testng_单元测试工具 TestNG 使用
  18. 智能手环APP软件开发
  19. 漫反射与Lambert模型
  20. 什么是手机证书和签名干什么用的

热门文章

  1. 腾讯AI Lab发布「电竞虚拟人」,视频版本一次看!
  2. 【报名中】数据库大咖们与你聊聊云上实践的那些事儿
  3. SRS流媒体服务器搭建+ffmpeg推流VLC取流观看
  4. Linux系统中df与du命令查看分区大小
  5. redis module模块简单使用
  6. 连接池,数据库连接池
  7. 面试必会系列 - 5.2 详解OSI模型与七层协议,网络TCP/IP基础,三次握手、四次挥手等
  8. vb 绘制图形/蝴蝶动画
  9. java高级用法之:调用本地方法的利器JNA
  10. dart系列之:dart语言中的特殊操作符