点击上方“小强的进阶之路”,选择“星标”公众号

重磅干货,第一时间送达!

预计阅读时间:8分钟

前几篇文章介绍了mysql的底层数据结构和mysql优化的神器explain。

BAT大厂都会问的MySQL底层数据结构

一线互联网公司必问的MySql优化神器

后台有些朋友说小强只介绍概念,平时使用还是一脸懵,强烈要求小强来一篇实战sql优化,经过周末两天的整理和总结,sql优化实战新鲜出炉, 大家平时学习和工作中,遇到的99% 的sql优化都会介绍到,介于篇幅过长,分成3篇文章哈。

CREATE TABLE `employees` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',

`age` int(20) NOT NULL DEFAULT '0' COMMENT '年龄',

`position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位',

`hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '入职时间',

PRIMARY KEY (`id`),

KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表';

insert into employees(name,age,position,hire_time) values('LiLei', 22, 'manager', NOW())

insert into employees(name,age,position,hire_time) values('HanMeimei', 23, 'dev', NOW())

insert into employees(name,age,position,hire_time) values('Lucy', 23, 'dev', NOW())

全值匹配

索引的字段类型是varchar(n):2字节存储字符串长度,如果是utf-8, 则长度是3n+2

EXPLAIN select * from employees where name='LiLei';

EXPLAIN select * from employees where name='LiLei' AND age = 22;

EXPLAIN select * from employees where name='LiLei' AND age = 22 AND position = 'manager';

最左前缀法则

如果索引是多列,要最受最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。以下三条sql根据最左前缀法则,都不会走索引。

EXPLAIN select * from employees where age = 22 AND position='manager';

EXPLAIN select * from employees where position ='manager';

EXPLAIN select * from employees where age=17;

索引失效

不要在索引列上做任何操作(计算、函数、类型转换),会导致索引失效而转向全表扫描。

EXPLAIN select * from employees where name='LiLei';

EXPLAIN select * from employees where left(name, 3)='LiLei';

给hire_time增加一个普通索引:

alter table `employees` ADD INDEX `idx_hire_time`(`hire_time`) USING BTREE;

EXPLAIN select * from employees where date(hire_time) = '2019-08-25';

还原最初索引状态

ALTER TABLE `employees` DROP INDEX `idx_hire_time`;

存储引擎不能使用索引中范围条件右边的列

-- EXPLAIN SELECT * FROM employees WHERE name ='LiLei' AND age=22 AND position ='manager';

EXPLAIN SELECT * FROM employees WHERE name ='LiLei' AND age>22 AND position ='manager';

看到key_len这个索引长度是78, 也就是只使用到了前两个字段name和age,postition没有使用到索引的。

覆盖索引

尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),减少selelct * 语句。

EXPLAIN SELECT name,age,position FROM employees WHERE name ='LiLei' AND age=22 AND position ='manager';

条件判断

mysql在使用不等于(! = 或者 <>)的时候无法使用索引会导致全表扫描

EXPLAIN SELECT * FROM employees WHERE name !='LiLei' ;

空值判断

is null,is not null也无法使用索引

EXPLAIN SELECT * FROM employees WHERE name is null;

like

like以通配符开头(‘$abc’)mysql索引失效会变成全表扫描操作

EXPLAIN SELECT * FROM employees WHERE name LIKE '%Lei';

字符串不加单引号索引失效

EXPLAIN SELECT * FROM employees WHERE name ='1000';

EXPLAIN SELECT * FROM employees WHERE name =1000;

不加单引号的字符串,mysql底层会使用cust函数将其转换为字符串,此时索引失效。

or&in少使用

少用or或in,用它查询时,mysql不一定使用索引,mysql内部优化器会根据索引比例、表大小等多个因素整体评估是否使用索引。

EXPLAIN SELECT * FROM employees WHERE name ='LiLei' or name='HanMeimei';

范围查询优化

给年龄添加单值索引

ALTER TABLE `employees`ADD INDEX `idx_age`(`age`) USING BTREE;

EXPLAIN select * from employees where age > 1 and age <= 2000;

没有走索引原因:mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引。这个例子没有走索引可能是因为单次数据量查询过大导致优化器最终选择不走索引。优化方法:可以将大的范围拆分成多个小范围。

End

关注【小强的进阶之路】技术公众号:

  • 回复“1”进大型内推群!

  • 回复“2”免费获取海量开发学习资料!

  • 回复“3”加入知识星球,和大牛一起学习!

  • 近期热文:

  • 比Hive快500倍!大数据实时分析领域的黑马

  • 《从0到1学习Netty》-遇见Netty

  • 互联网JAVA面试常问问题(七)- 带你走入AQS同步器源码

sql是否包含多个字符串_工作中遇到的99%SQL优化,这里都能给你解决方案相关推荐

  1. sql优化中in关键字_工作中遇到的一个SQL优化问题与解决方案

    我们公司是做汽车服务行业SCRM门店管理系统的,其中一个功能是查出该门店的所有会员与之对应的车辆.有三张表,核心字段如下: 需求:查出某个门店下的所有会员与车辆列表(会员姓名,车辆品牌,车牌号,车标l ...

  2. python工作遇到的问题_工作中遇到的问题收集--.NET

    一.拒绝访问 temp 目录.用来运行 XmlSerializer 的标识"IIS APPPOOL\MZJYMIS"没有访问 temp 目录的足够权限.CodeDom 将使用进程正 ...

  3. python创建一个字典、关键字为只包含字母的字符串_探究Python源码,终于弄懂了字符串驻留技术...

    摘要:在本文中,我们将深入研究 Python 的内部实现,并了解 Python 如何使用一种名为字符串驻留(String Interning)的技术,实现解释器的高性能. 每种编程语言为了表现出色,并 ...

  4. spark 算子使用类变量_自己工作中超全spark性能优化总结

    来源:https://zhuanlan.zhihu.com/ p/108454557 作者:一块小蛋糕 编辑:深度传送门 Spark是大数据分析的利器,在工作中用到spark的地方也比较多,这篇总结是 ...

  5. 收集一些工作中常用的经典SQL语句

    作为一枚程序员来说和数据库打交道是不可避免的,现收集一下工作 中常用的SQL语句,希望能给大家带来一些帮助,当然可能不全面,欢迎补充! 1.执行插入语句,获取自动生成的递增的ID值 INSERT IN ...

  6. rsatool使用步骤图解_工作中想要事半功倍?图解来助你

    一次会议上,老板让我们进行一场头脑风暴,然后将脑中浮现出来的想法以ppt的形式,在会议上与大家分享.在会上我看到其他区域的同事做的ppt,真的叫一个精美啊,有图形对比.有案例分析.有未来展望.反观自己 ...

  7. 工作缺点和不足及措施_工作中存在的问题_个人工作缺点和不足

    工作中存在的问题 出纳工作中有关现金的最基础的问题 问题补充:是不是抽屉里的现金在下班前全要存入保险柜中呢?找零用的零钱,也要存入保险柜吗? ●出纳的工作之一就是要保证现金的安全,并做到账实相符.支票 ...

  8. java中记忆深刻的问题_工作中碰到比较印象深刻的问题(面试必问)

    面试官经常会问到这么一个问题.有些人可能有些误区认为我们工作中碰到的问题都必须是很牛的技术来解决了才能说出来.其实不是的,我们工作中碰到的任何难点都只是在解决办法上的思想上没有打通而已. 举个例子: ...

  9. exce中让两列数据一一对应_工作中被重复数据所烦恼?学会这几个Excel技巧,少加班...

    工作中,经常被重复的数据所困扰,那就学下这几个关于重复值的技巧,每天5分钟,工作更轻松! 1.快速查找单列重复数据 如果某一列中,有的数据是重复的,我们希望把它找出来,可以在条件格式中突出单元格,然后 ...

最新文章

  1. 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★
  2. 为什么需要IP地址?—Vecloud微云
  3. 数据结构Java08【二叉平衡树(AVL)-概述、单旋转、双旋转】
  4. HDU 4747 Mex
  5. mysql 匹配所有记录_如何记录mysql中所有的查询
  6. WEB测试—兼容测试
  7. 优秀java程序员-利器-eclipse-01 快捷键
  8. html5杂音,HTML5柏林噪音算法实现的墨汁浸染背景图片过渡动画特效
  9. Nginx 解决请求跨域 与 配置 gzip 压缩
  10. 肉肉好走,愿你在异界依旧快乐活泼
  11. 关于代理。谢谢方志朋
  12. 所谓语音合成 是计算机根据语言学,计算机语音合成在GAI中的应用
  13. 计算机毕设 SpringBoot 校园志愿者管理系统 志愿者管理系统 志愿者信息管理系统Java Vue MySQL数据库 远程调试 代码讲解
  14. IE浏览器极限提速完全攻略
  15. STM32编程环境配置(kile5)
  16. html图片十字形,CSS3 十字架
  17. opencv medianBlur均值滤波
  18. PS制作透明的BMP图片
  19. 后渗透篇:COM劫持及加载技术
  20. 一个精壮的代购骗子被我用Python彻底征服了

热门文章

  1. boost::spirit模块实现使用单个融合序列来生成不同序列中元素的输出的测试程序
  2. boost::smart_ptr模块boost/pointer_cast.hpp 的测试
  3. allocator_difference_type的实例
  4. boost::callable_traits的qualified_class_of_t的测试程序
  5. ITK:将两个图像加在一起
  6. VTK:网格之QuadricDecimation
  7. OpenCV Lucas-Kanade光流计算的实例(附完整代码)
  8. Qt Creator编辑状态图
  9. Qt Creator使用文本编辑宏
  10. C语言十六进制转八进制(附完整源码)