设为首页 收藏本站
查看: 1038|回复: 0

[经验分享] 一个mysql优化技巧的误区

[复制链接]

尚未签到

发表于 2018-10-9 12:13:27 | 显示全部楼层 |阅读模式
  关于sql优化技巧,大家可能见过N个版本,尤其容易博得初中级程序员的眼球。倘若没有一点分析实践能力,直接将其拿来当作圣经记在心中并实践于工作中,那你极有可能被掉坑。轻则代码运行转圈圈无响应,重则导致项目瘫痪造成经济损失。
  废话不多说,直接上图。
DSC0000.png

  上面这条技巧粗略看一眼好像也没有什么问题。可事实是这样的吗?
  结论当然是否定的。且看实例分析:
CREATE TABLE `t_auxiliary_info` (  
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  
  `ac_id` tinyint(3) unsigned NOT NULL COMMENT '分类ID',
  
  `name` varchar(250) NOT NULL DEFAULT '' COMMENT '名称',
  
  `number` smallint(6) unsigned NOT NULL DEFAULT '1' COMMENT '编号',
  
  `attr` varchar(500) NOT NULL DEFAULT '' COMMENT '属性',
  
  `fdbid` int(10) unsigned NOT NULL COMMENT '用户ID',
  
  `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态:1有效,0无效',
  
  `stock_type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '存货类型:1库存商品,2原材料,3周转材料',
  
  PRIMARY KEY (`id`),#请注意这里的索引
  
  KEY `uniq_cid_acid` (`fdbid`,`ac_id`)
  
) ENGINE=InnoDB AUTO_INCREMENT=645101 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
  上面是一张普通的业务表,仔细看表中设置的索引:
  PRIMARY KEY (`id`),#主键索引  
  KEY `uniq_cid_acid` (`fdbid`,`ac_id`)#联合索引
  再使用上述的in 或not in 来实践以下,通过explain执行计划工具看看实际效果。(在这里为了公平起见,我不使用主键id,且in操作中的数据不是连续的。)
select *  
from t_auxiliary_info
  
where fdbid in('1000','1500','1234','5155','6789','3423','5368','245645');
在上面的sql中,我们使用包含在联合索引`uniq_cid_acid`中的字段 `fdbid`作为搜索条件  见证奇迹的时刻到了。
DSC0001.png

  通过执行计划, 我们可以清晰的看到这条sql的检索类型为简单简单检索,属于范围查询,且已经使用到了索引  uniq_cid_acid,且没有全表扫描(扫描行数为2804,而本表中数据条数为645101)。
  由此可以得出结论:不是所有sql中的in查询会全表扫描。这里推翻了in会导致全表扫描的结论。
  
  那么在什么情况下,使用in操作一样可以使用到索引,不会全表扫描呢?
  答:  in的字段必须是带有索引的字段。
  ps:  in(...) 中的数据最好加上引号,即使字段类型是数字。
  
          在 看看not in
select *  
from t_auxiliary_info
  
where fdbid not in(1000,1500,1234,5155,6789,3423,5368,245645);
  真相在这里:
DSC0002.png

  not in确实会全表扫描。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-619591-1-1.html 上篇帖子: mysql 5.1版本 修改密码,及远程登录mysql数据库 下篇帖子: linux mysql 数据按表明备份备份
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表