(1)负向条件查询不能使用索引select * from user where status!=0 ,not in/not exists都不是好习惯可以优化为in查询:select * from user where status in(1,2)

数据准备:

CREATE TABLE `user` ( `id` bigint(20) NOT NULL, `name` varchar(32) DEFAULT NULL, `age` int(11) DEFAULT NULL, `status` int(1) DEFAULT NULL, KEY `index_status` (`status`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;INSERT INTO `user` VALUES ('1', '张三', '12', '0');INSERT INTO `user` VALUES ('2', '李四', '23', '1');INSERT INTO `user` VALUES ('3', '王五', '34', '2');//在status字段添加索引

测试结果:

type连接类型为:all(全表扫描)

type连接类型为:ref(非注解唯一索引扫描)

(2)前导模糊查询不能使用索引select * from user where name like '%张三' 而非前导模糊查询则可以:select * from user where name like '张三%'

数据准备:

CREATE TABLE `user` ( `id` bigint(20) NOT NULL, `name` varchar(32) DEFAULT NULL, `age` int(11) DEFAULT NULL, `status` int(1) DEFAULT NULL, KEY `index_name` (`name`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;INSERT INTO `user` VALUES ('1', '张三', '12', '0');INSERT INTO `user` VALUES ('2', '李四', '23', '1');INSERT INTO `user` VALUES ('3', '王五', '34', '2');//在name字段添加索引

测试结果:

type连接类型为:all(全表扫描)

type连接类型为:range(范围扫描)

(3)数据区分度不大的字段不宜使用索引select * from user where sex=1原因:性别只有男,女,每次过滤掉的数据很少,不宜使用索引。经验上能过滤80%数据时可以使用索引

(4)在属性上进行计算不能命中索引select * from user where YEAR(birth_date) < = '2017' 即使date上建立了索引,也会全表扫描,可优化为值计算:select * from user where birth_date< = '2000-01-01'

数据准备

CREATE TABLE `user` ( `id` bigint(20) NOT NULL, `name` varchar(32) DEFAULT NULL, `sex` int(1) DEFAULT NULL, `birth_date` date DEFAULT NULL, KEY `index_birth_date` (`birth_date`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;INSERT INTO `user` VALUES ('1', '张三', '0', '2010-02-03');INSERT INTO `user` VALUES ('2', '李四', '1', '2000-02-02');INSERT INTO `user` VALUES ('3', '王五', '1', '1998-09-09');//在birth_date上添加索引

测试结果:

全表扫描,没有列出可能应用的索引

全表扫描,显示可能应用在这张表中的索引

(5)如果业务大部分是单条查询,使用Hash索引性能更好,例如用户表select * from user where id=1或select * from user where name='张三',原因:B-Tree索引的时间复杂度是O(log(n))Hash索引的时间复杂度是O(1)

(6)允许为null的列,查询有潜在大坑,单列索引不存null值,复合索引不存全为null的值,如果列允许为null,可能会得到"不符合预期”结果,所以请使用not null约束以及默认值

(7)复合索引最左前缀,并不是值SQL语句的where顺序要和复合索引一致,用户表建立了(login_name, passwd)的复合索引,select * from user where login_name=? and passwd=? ; select * from user where passwd=? and login_name=?; select * from user where login_name=? 都能命中索引,他们都满足复合索引最左前缀。 然而select * from user where passwd=?不能命中索引,不满足复合索引最左前缀

数据准备

CREATE TABLE `user` ( `id` bigint(20) NOT NULL, `login_name` varchar(32) DEFAULT NULL, `password` varchar(32) DEFAULT NULL, KEY `index_loginname_password` (`login_name`,`password`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;//在login_name,password列建立复合索引,KEY `index_loginname_password` (`login_name`,`password`)

测试结果:

三条sql语句都能命中索引

不满足复合索引最左原则,不能命中索引

(8)如果明确知道只有一条结果返回,limit 1能够提高效率select * from user where login_name=? 可以优化为:select * from user where login_name=? limit 1原因:你知道只有一条结果,但数据库并不知道,明确告诉它,让它主动停止游标移动

(9)强制类型转换会全表扫描select * from user where phone_no=13800001234你以为会命中phone_no索引么?那就错了,因为phone_no是varchar(11) ,所以13800001234会强制转换类型,如果phone_no为bigint(20),那么phone_no=13800001234和phone_no='13800001234'都会走索引

数据准备

CREATE TABLE `user` ( `id` bigint(20) NOT NULL, `phone_no` varchar(11) DEFAULT NULL, KEY `index_phone_no` (`phone_no`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;//在phone_no列加索引,KEY `index_phone_no` (`phone_no`)

测试结果:

发生类型转换,没有走索引

sql int转换为varchar_常见SQL优化实践相关推荐

  1. Spark SQL 在字节跳动的核心优化实践

    10月26日,字节跳动技术沙龙 | 大数据架构专场 在上海字节跳动总部圆满结束.我们邀请到字节跳动数据仓库架构负责人郭俊,Kyligence 大数据研发工程师陶加涛,字节跳动存储工程师徐明敏,阿里云高 ...

  2. 腾讯基于 Flink SQL 的功能扩展与深度优化实践

    简介:本文由腾讯高级工程师杜立分享,主要介绍腾讯实时计算平台针对 Flink SQL 所做的优化. 整理:戴季国(Flink 社区志愿者) 校对:苗文婷(Flink 社区志愿者) 摘要:本文由腾讯高级 ...

  3. sql in转换为join_同一个SQL语句,为啥性能差异咋就这么大呢?(1分钟系列)

    <数据库允许空值,往往是悲剧的开始>一文通过explain来分析SQL的执行计划,来分析null对索引命中情况的影响,有不少朋友留言,问explain结果中的type字段,ref,ALL等 ...

  4. MySQL的SQL语句转PostgreSQL的SQL语句工具编写总结

    1.起因在学习基于vue+springboot的前后端分离项目时,因项目需求变更,需要将mysql数据库全部迁移到postgersql数据库的需求,因而编写了一个基于jave的sql语句转换工具 2. ...

  5. 字节跳动在 Spark SQL 上的核心优化实践

    作者 | 郭俊 封图 | BanburyTang 字节跳动数据仓库架构团队负责数据仓库领域架构设计,支持字节跳动几乎所有产品线(包含但不限于抖音.今日头条.西瓜视频.火山视频)数据仓库方向的需求,如 ...

  6. MySQL 性能优化:8 种常见 SQL 错误用法!

    声明:转载自 MySQL 性能优化:8 种常见 SQL 错误用法! 1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是 ...

  7. 字节跳动在Spark SQL上的核心优化实践

    字节跳动在Spark SQL上的核心优化实践 大数据架构 今天 以下文章来源于字节跳动技术团队 ,作者郭俊 字节跳动技术团队 字节跳动的技术实践分享 10月26日,字节跳动技术沙龙 | 大数据架构专场 ...

  8. 上海沙龙回顾 | ​字节跳动在Spark SQL上的核心优化实践

    10月26日,字节跳动技术沙龙 | 大数据架构专场 在上海字节跳动总部圆满结束.我们邀请到字节跳动数据仓库架构负责人郭俊,Kyligence 大数据研发工程师陶加涛,字节跳动存储工程师徐明敏,阿里云高 ...

  9. sql limit 子句_Java 8流中的常见SQL子句及其等效项

    sql limit 子句 功能编程允许使用通用语言进行准声明性编程 . 通过使用功能强大的流畅API(例如Java 8的Stream API )或jOOλ的顺序Stream扩展Seq或更复杂的库(例如 ...

最新文章

  1. 【网络安全】详细记录一道简单面试题的思路和方法
  2. Mac MySQLdb模块安装,可算解决了
  3. java bitset_Java BitSet toString()方法与示例
  4. 关于C语言中的Bool类型变量的一点看法
  5. java mbean获取堆信息_实时取得虚拟机类信息、内存信息、MXBean的使用方法
  6. java解析ajax的数据_java ajax 请求后获取 json 数据 以及 使用 解析 ,解惑
  7. Keepalived实现mysql高可用
  8. Android 中流量、电量、弱网环境怎么测?
  9. GalGame汉化教程(一)——Ollydbg修改编码和字体
  10. 【JSOI2018】绝地反击
  11. ERP实施中需掌握的基本财务基础知识
  12. Tesla M40 下Ubuntu anaconda pycharm pytorch安装
  13. 我们如何在Linkerd 2.2里设计重试 1
  14. 每秒上万并发下的Spring Cloud性能优化之道
  15. python无法导入模块_pycharm无法导入本地模块的解决方式
  16. 全世界199个国家首都经纬度
  17. 中国网络视频行业发展战略预测及未来发展趋势展望报告2021-2027年
  18. 【域名】域名解析优先级以及其他玩法
  19. SpringCloud精讲课件(内附源码)
  20. java mp3 播放_JAVA播放MP3

热门文章

  1. 修改域名dns服务器,新网互联域名如何修改DNS设置方法
  2. Word查找的通配符和特殊字符!
  3. pyhton列表习题
  4. python 爬预警没解析前的
  5. Centos7 修改运行级别
  6. selenium借助AutoIt识别上传(下载)详解
  7. apache忽略文件后缀
  8. 在 Delphi 下使用 DirectSound (5): 获取或设置缓冲区的格式:
  9. 论如何寻找万一的川财证券开户渠道
  10. Typora入门(1)