MySQL where xxx in 不使用索引 查询很慢!!
时间:2011-07-17
来源:互联网
where CX_BS IN (SELECT CX_BS FROM CJ_CX WHERE SCCJ_DM= 'xxxx')
CJ_LS表中有200多万条记录,CX_BS 上有索引,但是这个sql的执行计划是:
1 PRIMARY CJ_LS ALL 2111632 Using where
2 DEPENDENT SUBQUERY CJ_CX ref PK_CJ_CX,IDX_CJ_CX_SCCJ_DM IDX_CJ_CX_SCCJ_DM 15 const 1 Using where
CJ_LS表还是进行了全表扫描
我执行过 ANALYZE TABLE cj_ls 表分析,现在查询很慢,怎么才能使用cx_bs上的索引呢??
作者: edgar108 发布时间: 2011-07-17
select * from CJ_LS
where CX_BS IN (SELECT CX_BS FROM CJ_CX WHERE SCCJ_DM= 'xxxx')
CJ_LS表中有200多万条记录,CX_BS 上有索引,但是这个sql的执行计划是:
1 PRIMARY CJ_LS ALL 2111632 Using where
2 DEPENDENT SUBQUERY CJ_CX ref PK_CJ_CX,IDX_CJ_CX_SCCJ_DM IDX_CJ_CX_SCCJ_DM 15 const 1 Using where
CJ_LS表还是进行了全表扫描
我执行过 ANALYZE TABLE cj_ls 表分析,现在查询很慢,怎么才能使用cx_bs上的索引呢??
首先改写SQL
select * from CJ_LS
where CX_BS IN (SELECT CX_BS FROM CJ_CX WHERE SCCJ_DM= 'xxxx')
为:
SELECT * FROM CJ_LS M
WHERE EXISTS (SELECT 1 FROM CJ_CX N WHERE N.SCCJ_DM= 'xxxx' AND M.CX_BS=N.CX_BS);
其次最好,SCCJ_DM字段上有索引,且其过滤性还不错;CX_BS上也有索引
作者: jinguanding 发布时间: 2011-07-17
作者: jinguanding 发布时间: 2011-07-17
WHERE EXISTS (SELECT 1 FROM CJ_CX N WHERE N.SCCJ_DM= 'xxxx' AND M.CX_BS=N.CX_BS);
执行 计划 :
1 PRIMARY M ALL 2154403 Using where
2 DEPENDENT SUBQUERY N ref PK_CJ_CX,IDX_CJ_CX_SCCJ_DM IDX_CJ_CX_SCCJ_DM 15 const 1 Using where
作者: edgar108 发布时间: 2011-07-17
EXPLAIN SELECT * FROM CJ_LS M
WHERE EXISTS (SELECT 1 FROM CJ_CX N WHERE N.SCCJ_DM= 'xxxx' AND M.CX_BS=N.CX_BS);
执行 计划 :
1 PRIMARY M ALL 2154403 Using where
2 DEPENDENT SUBQUERY N ref PK_CJ_CX,IDX_CJ_CX_SCCJ_DM IDX_CJ_CX_SCCJ_DM 15 const 1 Using where
CJ_LS上的字段:CX_BS有索引嘛,以及其过滤性如何?
作者: jinguanding 发布时间: 2011-07-17
CREATE TABLE `cj_ls` (
`BBHM` decimal(6,0) DEFAULT NULL,
`CX_BS` varchar(32) DEFAULT NULL,
`ZDJS_JG` decimal(16,2) DEFAULT NULL,
`CC_JG` decimal(16,2) DEFAULT NULL,
`SCPJ_JG` decimal(16,2) DEFAULT NULL,
UNIQUE KEY `PK_CJ_LS` (`CX_BS`,`BBHM`),
KEY `IDX_CJ_LS_CX_BS` (`CX_BS`),
KEY `IDX_CJ_LS_CX_BS_BBHM` (`BBHM`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk
有索引的
作者: edgar108 发布时间: 2011-07-17
cj_ls 0 PK_CJ_LS 1 CX_BS A 538600 YES BTREE
cj_ls 0 PK_CJ_LS 2 BBHM A 2154403 YES BTREE
cj_ls 1 IDX_CJ_LS_CX_BS 1 CX_BS A 538600 YES BTREE
cj_ls 1 IDX_CJ_LS_CX_BS_BBHM 1 BBHM A 21 YES BTREE
作者: edgar108 发布时间: 2011-07-17
SELECT m.*
FROM CJ_LS M, CJ_CX N
where m.CX_BS = n.CX_BS
and N.SCCJ_DM= 'xxxx';
如果SCCJ_DM是唯一的,用
select * from CJ_LS
where CX_BS = (SELECT CX_BS FROM CJ_CX WHERE SCCJ_DM= 'xxxx')
作者: kerlion 发布时间: 2011-07-17
其实 执行的是 存储过程中的一个delete 语句:
delete from CJ_LS where CX_BS IN (SELECT CX_BS FROM CJ_CX WHERE SCCJ_DM= ver_sccj_dm);
通过 show processlist 看到 这个delete 很慢
如果写成join的形式,delete该怎么写呢? 谢谢了。。
作者: edgar108 发布时间: 2011-07-17
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28