设为首页 加入收藏

TOP

警惕MySql更新sql的WHERE从句中的IN()子查询时出现的陷阱(二)
2015-11-21 01:47:11 来源: 作者: 【 】 浏览:3
Tags:警惕 MySql 更新 sql WHERE 从句中 查询 出现 陷阱
OMMENT '收银台照片', `scene_photo` text COMMENT '经营场景照片', `mer_agreement` text COMMENT '商户协议', `other_qualification` text COMMENT '其他特殊资质', `EXPECT_OPEN_TIME` datetime DEFAULT NULL, `IN_OUT_FLAG` varchar(32) DEFAULT NULL, `DCC_MODE` int(2) DEFAULT '0', `SPECIAL_FLAG` tinyint(4) DEFAULT NULL, `TRADING_CURRENCY` varchar(3) DEFAULT NULL, `STATUS` int(11) DEFAULT '0', `EDITABLE` tinyint(4) DEFAULT NULL, `MER_SINGLE_LIMIT` decimal(30,5) DEFAULT NULL, `MER_DAY_LIMIT` decimal(30,5) DEFAULT NULL, `MER_NATION` varchar(3) DEFAULT NULL, `ROUTE_SCHEME` varchar(13) DEFAULT NULL, `CREATOR_ID` int(11) DEFAULT NULL, `CREATOR_NAME` varchar(32) DEFAULT NULL, `create_time` datetime NOT NULL COMMENT '记录创建时间', `modify_time` datetime NOT NULL COMMENT '最好修改时间', `TERM_CNT` int(11) DEFAULT NULL, `DATA_SRC` tinyint(4) NOT NULL DEFAULT '1', `CUP_CARD_PLAN` bit(1) DEFAULT NULL, `UPI_CARD_PLAN` bit(1) DEFAULT NULL, `RISK_DESC` varchar(50) DEFAULT NULL, `IS_FLAG` char(1) DEFAULT NULL, `ALP` decimal(22,3) DEFAULT NULL, `WXP` decimal(22,3) DEFAULT NULL, `dfs_edc_fee` decimal(22,3) DEFAULT NULL, `prp_edc_fee` decimal(22,3) DEFAULT NULL, `in_account_id_card` text COMMENT '入账人身份证', `in_account_bank_card` text COMMENT '入账银行卡信息', `ins_credit_card` text COMMENT '机构信用代码证', `ins_store_photo` text COMMENT '仓库照片', `lease_agreement` text COMMENT '租赁协议', `sct` decimal(22,3) DEFAULT NULL COMMENT '扫码支付(支付宝、微信整合)', `card_type` char(1) DEFAULT '1' COMMENT '法人证件类型(1:身份证,2:护照)', PRIMARY KEY (`STAGE_ID`), KEY `mer_stage_s_e_ms` (`STATUS`,`EDITABLE`,`MER_STATUS`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=216826 DEFAULT CHARSET=utf8;
proc 表有 6450 条记录,DDL:
CREATE TABLE `proc` (
  `proc_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '流程id',
  `proc_name` varchar(32) NOT NULL COMMENT '流程名称,如 新增商户全聚德审批流程',
  `proc_type` tinyint(4) NOT NULL COMMENT '流程类型:1-新增商户,2-变更商户,3-新增终端',
  `associated_id` int(11) NOT NULL COMMENT '流程关联的商户id或其他',
  `node_id` tinyint(4) NOT NULL COMMENT '流程进行到哪个节点',
  `associated_name` varchar(64) DEFAULT NULL COMMENT '流程关联的商户名称',
  `proc_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '流程状态:1-启动流程,2-进行中,3-已完成',
  `starter_id` int(11) NOT NULL COMMENT '流程发起者用户id',
  `starter_name` varchar(32) NOT NULL COMMENT '流程发起者用户名',
  `node_name` varchar(64) NOT NULL COMMENT '节点名称',
  `next_id` tinyint(4) NOT NULL COMMENT '下一节点id',
  `next_name` varchar(64) NOT NULL COMMENT '下一节点名称',
  `create_time` datetime NOT NULL COMMENT '记录创建时间',
  `ass_version` datetime NOT NULL COMMENT '关联版本号',
  `node_remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `modify_time` datetime DEFAULT NULL COMMENT '上一节点完成时间',
  `mer_id` int(11) NOT NULL,
  PRIMARY KEY (`proc_id`),
  KEY `proc_mer_id_index` (`mer_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6451 DEFAULT CHARSET=utf8 COMMENT='流程';

关于这两张表的一个慢查询日志如下:
# Time: 150703 15:13:33
# User@Host: test[test] @ localhost [127.0.0.1] Id: 1
# Query_time: 2.101248 Lock_time: 0.046034 Rows_sent: 0 Rows_examined: 865689
SET timestamp=1435907613;
update mer_stage set editable = 1 where stage_id in(
select associated_id from proc where proc_id in(6446 , 6447 , 6450));
日志中可以看出该 sql 的执行时间是 2.101 s。
我们来查看一下该 sql 的执行计划:
我们来查看一下该 sql 的执行计划
注意:select_type 里出现了 DEPENDENT SUBQUERY。
这意味着什么?——子查询取决于外面的查询,MySql 先执行外查询,内查询根据这个查询结果(如执行计划里所述,190102 rows)的每一条记录组成新的
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MySQL优化之――备份和恢复 下一篇mysql常用函数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: