sql int转换为varchar_常见SQL优化实践
(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优化实践相关推荐
- Spark SQL 在字节跳动的核心优化实践
10月26日,字节跳动技术沙龙 | 大数据架构专场 在上海字节跳动总部圆满结束.我们邀请到字节跳动数据仓库架构负责人郭俊,Kyligence 大数据研发工程师陶加涛,字节跳动存储工程师徐明敏,阿里云高 ...
- 腾讯基于 Flink SQL 的功能扩展与深度优化实践
简介:本文由腾讯高级工程师杜立分享,主要介绍腾讯实时计算平台针对 Flink SQL 所做的优化. 整理:戴季国(Flink 社区志愿者) 校对:苗文婷(Flink 社区志愿者) 摘要:本文由腾讯高级 ...
- sql in转换为join_同一个SQL语句,为啥性能差异咋就这么大呢?(1分钟系列)
<数据库允许空值,往往是悲剧的开始>一文通过explain来分析SQL的执行计划,来分析null对索引命中情况的影响,有不少朋友留言,问explain结果中的type字段,ref,ALL等 ...
- MySQL的SQL语句转PostgreSQL的SQL语句工具编写总结
1.起因在学习基于vue+springboot的前后端分离项目时,因项目需求变更,需要将mysql数据库全部迁移到postgersql数据库的需求,因而编写了一个基于jave的sql语句转换工具 2. ...
- 字节跳动在 Spark SQL 上的核心优化实践
作者 | 郭俊 封图 | BanburyTang 字节跳动数据仓库架构团队负责数据仓库领域架构设计,支持字节跳动几乎所有产品线(包含但不限于抖音.今日头条.西瓜视频.火山视频)数据仓库方向的需求,如 ...
- MySQL 性能优化:8 种常见 SQL 错误用法!
声明:转载自 MySQL 性能优化:8 种常见 SQL 错误用法! 1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是 ...
- 字节跳动在Spark SQL上的核心优化实践
字节跳动在Spark SQL上的核心优化实践 大数据架构 今天 以下文章来源于字节跳动技术团队 ,作者郭俊 字节跳动技术团队 字节跳动的技术实践分享 10月26日,字节跳动技术沙龙 | 大数据架构专场 ...
- 上海沙龙回顾 | 字节跳动在Spark SQL上的核心优化实践
10月26日,字节跳动技术沙龙 | 大数据架构专场 在上海字节跳动总部圆满结束.我们邀请到字节跳动数据仓库架构负责人郭俊,Kyligence 大数据研发工程师陶加涛,字节跳动存储工程师徐明敏,阿里云高 ...
- sql limit 子句_Java 8流中的常见SQL子句及其等效项
sql limit 子句 功能编程允许使用通用语言进行准声明性编程 . 通过使用功能强大的流畅API(例如Java 8的Stream API )或jOOλ的顺序Stream扩展Seq或更复杂的库(例如 ...
最新文章
- 【网络安全】详细记录一道简单面试题的思路和方法
- Mac MySQLdb模块安装,可算解决了
- java bitset_Java BitSet toString()方法与示例
- 关于C语言中的Bool类型变量的一点看法
- java mbean获取堆信息_实时取得虚拟机类信息、内存信息、MXBean的使用方法
- java解析ajax的数据_java ajax 请求后获取 json 数据 以及 使用 解析 ,解惑
- Keepalived实现mysql高可用
- Android 中流量、电量、弱网环境怎么测?
- GalGame汉化教程(一)——Ollydbg修改编码和字体
- 【JSOI2018】绝地反击
- ERP实施中需掌握的基本财务基础知识
- Tesla M40 下Ubuntu anaconda pycharm pytorch安装
- 我们如何在Linkerd 2.2里设计重试 1
- 每秒上万并发下的Spring Cloud性能优化之道
- python无法导入模块_pycharm无法导入本地模块的解决方式
- 全世界199个国家首都经纬度
- 中国网络视频行业发展战略预测及未来发展趋势展望报告2021-2027年
- 【域名】域名解析优先级以及其他玩法
- SpringCloud精讲课件(内附源码)
- java mp3 播放_JAVA播放MP3