加入收藏 | 设为首页 | 会员中心 | 我要投稿 海洋资讯信息网_我爱站长网 (https://www.haijunwang.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL5.6 运用临时表做SQL优化

发布时间:2022-09-19 12:53:44 所属栏目:MySql教程 来源:
导读:  有一个系统从Oracle迁移到MySQL,在Oracle中运行很快MySQL 临时表,在MySQL基本运行不出来(等了10分钟都无法运行出来),该加的索引都加了,最后用临时表解决问题。

  SELECT COUNT(1)

  FROM (SELECT
  有一个系统从Oracle迁移到MySQL,在Oracle中运行很快MySQL 临时表,在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;
 

(编辑:海洋资讯信息网_我爱站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!