ITPUB论坛-中国专业的IT技术社区

 找回密码
 注册
查看: 791|回复: 6

mysql not in不走索引怎么优化

[复制链接]
认证徽章
论坛徽章:
5
优秀写手
日期:2013-12-19 06:00:132014年新春福章
日期:2014-02-18 16:50:09马上有车
日期:2014-02-18 16:50:09暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47
跳转到指定楼层
1#
发表于 2017-3-6 10:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
大家好:
      我有如下一条sql语句,速度很慢,需要30s才能执行完,下面是其执行计划:
mysql> explain select id,start_member_id,start_date,modify_member_id,modify_date from formmain_0141 where id not in (select content_data_id from ctp_content_all where content_data_id is not null and content_template_id='6890363387462501722') limit 20000, 10000 ;



上图中,我们看到 formmain_0141 没有任何索引

mysql> show index from formmain_0141;



可是我们通过上图发现 formmain_0141在id列 上是有主键索引的,可是为什么mysql没有走索引呢,另外我们应该怎么优化我们上面的sql语句呢


谢谢。








认证徽章
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
2#
发表于 2017-3-6 11:10 | 只看该作者
试试
select id,start_member_id,start_date,modify_member_id,modify_date from formmain_0141 where not exists (select 1 from ctp_content_all where content_data_id= formmain_0141 .id and content_data_id is not null and content_template_id='6890363387462501722') limit 20000, 10000 ;

另外如果content_template_id选择性较好,加个索引吧

使用道具 举报

回复
认证徽章
论坛徽章:
5
优秀写手
日期:2013-12-19 06:00:132014年新春福章
日期:2014-02-18 16:50:09马上有车
日期:2014-02-18 16:50:09暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47
3#
发表于 2017-3-6 15:01 | 只看该作者
fuiou_cary 发表于 2017-3-6 11:10
试试
select id,start_member_id,start_date,modify_member_id,modify_date from formmain_0141 where not ...

谢谢,content_template_id这个字段选择性不好,重复值特别多,不能加索引。用not exists后,执行速度快一倍,但是还需要15秒左后,原先30s,这样还是有问题,因为同一时间发生大量这个查询,会导致数据库cpu非常高,不知道还能不能优化

使用道具 举报

回复
认证徽章
论坛徽章:
12
优秀写手
日期:2014-09-03 06:00:13双鱼座
日期:2015-12-16 10:37:41天蝎座
日期:2015-12-02 14:44:59秀才
日期:2015-11-11 09:58:34ITPUB14周年纪念章
日期:2015-10-26 17:23:44巨蟹座
日期:2015-09-02 14:45:30金牛座
日期:2015-08-25 16:02:53天蝎座
日期:2015-07-21 16:49:04喜羊羊
日期:2015-07-07 16:42:312015年新春福章
日期:2015-03-06 11:59:47
4#
发表于 2017-3-6 15:43 | 只看该作者
czxin788 发表于 2017-3-6 15:01
谢谢,content_template_id这个字段选择性不好,重复值特别多,不能加索引。用not exists后,执行速度快 ...

那你就要从业务逻辑去优化了   换换实现方式    不能只盯着sql本身   

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2016-12-21 16:55:07
5#
发表于 2017-3-10 11:09 | 只看该作者
本帖最后由 woson_wang 于 2017-3-10 11:12 编辑

原sql: explain select id,start_member_id,start_date,modify_member_id,modify_date from formmain_0141 where id not in (select content_data_id from ctp_content_all where content_data_id is not null and content_template_id='6890363387462501722') limit 20000, 10000 ;
先说一句,提问类似优化的问题不提供表结构,挑战DBA耐性^~^
1.子查询里面的content_data_id字段是否可以约束not null,不行请看2
2.子查询里面的where字句:把not null和content_template_id='6890363387462501722'调换位置(若content_template_id字段有索引还可以走索引,不知道表结构什么样)
3.formmain_0141.id是主键索引的话,ctp_content_all.content_data_id上有唯一索引的吗?有就不用not null

使用道具 举报

回复
论坛徽章:
3
ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:482013年新春福章
日期:2013-02-25 14:51:24射手座
日期:2015-12-17 12:42:07
6#
发表于 2018-6-22 16:50 | 只看该作者
分页的方式  可以优化下
来自安卓客户端来自客户端

使用道具 举报

回复
论坛徽章:
73
秀才
日期:2018-06-21 10:08:00秀才
日期:2016-01-13 12:14:26秀才
日期:2015-12-25 15:31:10秀才
日期:2015-12-18 09:28:57秀才
日期:2015-12-14 14:56:09秀才
日期:2015-12-14 14:51:16秀才
日期:2015-11-30 09:13:06处女座
日期:2015-11-27 12:27:01秀才
日期:2015-11-23 10:17:19秀才
日期:2015-11-23 09:57:36
7#
发表于 2018-6-27 19:25 | 只看该作者
Mariadb支持hash join,会好点。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表
http://www.vxiaotou.com