Mysq数据量不大查询速度却很慢,记录一次left join查询优化
背景
趁着周末闲来无事,想起来之前看过的SQL优化,试一试效果。
效果
为了体现查询慢,所以...无视这烂SQL吧。
优化前
可以清楚的看到上面短短5W余条数据,居然要一分钟,这能忍?
优化后
神奇吧,这就是用好索引的效果,同样一条烂SQL,效果千差万别。
看完了效果,接下来我们说一下优化过程。
首先用explain这个命令来查看一下SQL语句的执行计划,看看该SQL语句有没有使用上了索引,有没有做全表扫描,这些都可以通过explain命令来查看。
通过explain命令,可以很清楚的看到我们SQL所关联的表执行计划。
下面说一下图中都有什么信息,代表什么意思。
expain出来的信息有10列,分别是id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra
- id:选择标识符,也就是查询的先后顺序排名,值越大,优先执行
- select_type:表示查询的类型。
- table:输出结果集的表,也可能是别名
- partitions:匹配的分区
- type:表示表的连接类型(常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好))
- possible_keys:表示查询时,可能使用的索引
- key:表示实际使用的索引
- key_len:索引字段的长度
- ref:列与索引的比较
- rows:扫描出的行数(估算的行数)
- filtered:按表条件过滤的行百分比
- Extra:执行情况的描述和说明
说完了expain命令,接下来开始进入正文。
一说到SQL优化,都是什么
注意通配符中Like的使用
避免在where子句中对字段进行函数操作
在子查询当中,尽量用exists代替in
where子句中尽量不要使用is null 或 is not null对字段进行判断
也确实都没毛病,但是这些都是在我们写SQL的时候尽量避免的,但是我们编码是为业务服务的,有时候业务就是变态,你不得不用。
其实优化最明显的就是使用索引了。
索引为何物?
答:参考我们平常读的书,书本前是不是都有一个叫目录的东西?那玩意就是索引,能够准确的定位到我们想要看的知识。
索引在哪创建?
以Navicat为例,找到目标表右键设计表就能进入编辑表结构的页面。
我们最常用的就是字段这个tab栏了,旁边就是索引栏。
切换到索引栏,就可以自己创建了,首先是命名,然后就是我们要使用的字段(重点),然后是索引类型和索引方法。
命名
- 唯一索引使用uni_[字段名]来命名
- 非唯一索引使用idx_[字段名]来命名
索引类型
- full textl: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
- normal:表示普通索引
- spatial:空间索引,空间索引是对空间数据类型的字段建立的索引
- unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique
- 总之,索引的类别由建立索引的字段内容特性来决定,通常normal最常见。
索引方法
- BTREE(B树(也叫多叉树)) (主流使用)
- HASH(key,value) 哈希这种方式对范围查询支持得不是很好
一般索引字段,都是我们需要对外进行关联的字段,例:on p.result_id = pr.result_id
两个表都建立是效果最佳的。(多张表,依次建立索引)
注意:字段的字符集一定要相同,不然建立索引也无法生效。
比如A表result_id是utf8mb4,那对应的B表也应该是utf8mb4,如果是其它,那么索引是无效的。
索引建立完成后,我们就可以看看效果了。
索引前计划效果
索引后计划效果
可以很清楚的看到计划中的改变和查询的时间效率。
优化总结
- 建立表时遵循数据库的三大范式。
- 多表查询时建立索引
- 注意字段字符集,避免索引失效
- 写SQL时尽量避免特殊写法,避免索引失效
最后
SQL优化涉及的东西挺多的,以上只是我提到的一小点。如果想要了解更多,可以看看MySql的数据结构。
Mysq数据量不大查询速度却很慢,记录一次left join查询优化相关推荐
- mysql一样的查询在我本地很快但是线上很慢_MySQL大数据量分页查询方法及其优化...
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...
- MySQL 和 Oracle 大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...
- 千万级别数据查询优化_MySQL大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...
- 大数据量分页查询方法(转)
本文旨在介绍一种对数据库中的大数据量表格进行分页查询的实现方法,该方法对应用服务器.数据库服务器.查询客户端的cpu和内存占用都较低,查询速度较快,是一个较为理想的分页查询实现方案. 1.问题的提出 ...
- .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录
步步为营VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页.延迟执行和日志记录 作者:webabcd 介绍 以Northwind为示例数据库,DLIN ...
- MySQL单表数据量过千万,采坑优化记录,完美解决方案
MySQL单表数据量过千万,采坑优化记录,完美解决方案 参考文章: (1)MySQL单表数据量过千万,采坑优化记录,完美解决方案 (2)https://www.cnblogs.com/ExMan/p/ ...
- MySQL大数据量分页查询方法及其优化
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多 链接:ht ...
- 千锋重庆Java学习之MySQL大数据量分页查询方法及其优化
方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N 适应场景: 适用于数据量较少的情况(元组百/千级) 原因/缺 ...
- python循环次数查询_大数据量Mysql查询后经过循环使用python分片
1 问题描述: (1)使用mysql查询基础数据,这里只有三四个基础的查询条件,联了一个表,同时有limit分页了: (2)之后经过一系列逻辑处理,在这些处理中又包含了很多sql查询,而且是在第(1) ...
最新文章
- wenbao与windows命令
- 云炬随笔20171213
- Go语言 命令行解析(一)
- SAP Fiori Elements - how to set breakpoint to get converted xml view parsed by f
- 查看oracle会话和进程_带有Oracle Digital Assistant和Fn Project的会话式UI
- Spring Boot学习总结(15)——Spring Boot优缺点再总结
- Java使用itextpdf生成PDF文件并添加斜面水印并完成下载(图片导出pdf)
- 微服务,软件应用开发的新纪元
- 简述人工智能的发展历程图_人工智能发展简史
- 软件工程-系统流程图
- iOS开发各种证书详解
- 研究生英语读写译教程下课文译文及课后答案
- 社交网络崛起带来口碑营销的复兴
- 安卓和iOS的兼容性问题: 键盘弹起时,固定在底部的按钮是否被弹到键盘上方
- 海康威视监控推流自建服务器实现网页端无插件1-2秒低延迟实时监控
- nginx: [warn] conflicting server name “xxx“ on 0.0.0.0:80解决
- 操作系统 进程管理(一)——进程的含义与状态
- 实现图片中文的识别和获取图片上文字的坐标(java实现)
- Linux中ls -l、ls -d和ls -ld的显示内容与区别
- 基于Java的开源3D游戏引擎jMonkeyEngine