Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >会优化,你真的会优化吗?其实你可能真的缺少一份理解【数据库篇】

会优化,你真的会优化吗?其实你可能真的缺少一份理解【数据库篇】

作者头像
赵小忠
发布于 2018-01-24 11:20:32
发布于 2018-01-24 11:20:32
8640
举报
文章被收录于专栏:禁心尽力禁心尽力

  其实,在写这篇博客之前,我也是感觉自己会点优化,至少知道不要使用“*”号啊,给经常查询的列创建索引啊什么的,其实都不是大家想的那样简单的,其实它们背后存在很多的东西,值得我们去理解和学习。

  和大家分享讨论一个问题吧,子查询连接查询哪一个查询速度快?最重要的目的是能帮助大家在以后的开发路上不要再犯我这种的错误,看到就是赚到,哈哈。

我的答案是连接查询。因为这是我在前几天的实践项目中亲身体会到的,感触颇深,在给我们公司的网站首页执行了一条统计SQL语句,当时我是用子查询写的sql语句,第一次执行了21.783sec,第二次执行了5.178sec,当时感觉很别扭,一个网站的首页加载要经过3-4秒钟才能刷出统计数据,太离谱了,于是我就尝试用连接查询进行改造一下,果然,查询速度嗖一下上去了,当时感觉有种征服了什么东西一样,真的,超有成就感,以前确实是写代码,没在这方面过多留意过,这次钻了一次确实挺好。

  直接上图吧,给大家展示一下子查询和连接查询的执行时间,(但是,一条sql语句的性能不能光靠查询时间来衡量,之前在一篇博文里看到的,蛮有感觉的)

  一、子查询统计

执行了5.198sec

  二、连接查询统计

执行了0.010sec。

  (为什么连接查询比子查询块,这个问题我一直在总结,比较它们的查询原理是如何扫描表结构的,一致还没能总结出一个舒服的答案,等后期总结好了分享,更希望高手指点,希望高手留言相助,正在努力理解...)

  好了,跟大家分享一点小东西之后,我们就切入正题,来谈谈简单优化及它们是如何来提升性能的。

  1、MySQL的查询过程:当我们通过MySQL的客户端发送一条SQL语句时,MySQL服务器到底做了哪些动作,经历了哪些过程,我还是借图说明吧

  简单给大家说明一下吧。

  MySQL数据库也是客户端/服务端通信协议的模式,在任意时刻,无非就是要么客户端向服务端发送请求,要么服务端向客户端响应查询结果,这两个动作不能同时发生。一旦一端开始发送消息,另一端要接收完整个消息才能响应它,所以我们无法将一个请求消息切成小块独立发送,也没有办法进行流量控制。

当客户端向服务端发送sql语句时,首先客户端会把查询语句做成一个单独的数据包发送给服务端,这时如果查询语句很长则需要设置参数,如果实在太大,服务端可能会拒绝接受更多数据并抛出异常。

同理,与之相反的是服务端从存储引擎中拿到数据后响应给客户端,这时服务端响应的数据可能会很多,无法将这些数据做成一个数据包,可能会做成多个数据包。但是当服务器响应客户端请求时,客户端必须完整的接收整个返回结果,而不能简单的只取前面几条结果,然后让服务器停止发送。因而在实际开发中,尽量保持查询简单且只返回必需的数据,减小通信间数据包的大小和数量是一个非常好的习惯,这也是查询中尽量避免使用SELECT *以及加上LIMIT限制的原因之一。

  2、查询时尽量使用limit做限制查询,原因上面已经分析,服务端可能会响应大量的数据包给客户端,我们通常只拿到前几条数据,后面的数据如果需要,则可以使用分页查询,边用边查。

  3、还有一个误区就是,当我们在设计表结构时,尽量将字段的数据类型设置到最小,够用就行,别瞻前顾后,就拿int类型来说吧,我们习惯将给int类型的字段设置长度,其实吧,你设置不设置都没什么卵用,int类型是采用16位存储空间,那么它的存储范围就已经确定,所以int(1)和int(20)对于存储和计算是相同的,大家改改吧,我也是刚学到的。

  4、我们在查询数据库,可能会用多个范围条件来作限制,比如查询某一时间段内入职的某一年龄段的员工,此时需要接纳的一点是,MySQL无法同时使用俩个字段的索引,它只会选择一种的一个字段的索引来做查询。

  5、建议大家经常把表中一些不常用的索引删掉,定期删除一些长时间未使用过的索引是一个非常好的习惯。(在这儿给大家嘱咐一下,不要认为索引就是查询最好的工具,如果有时候查询非常小的表时,建议不要建立索引,直接全表扫描效果会更好)。

优化的学习旅程才刚开始,后期会给大家带来更多的经验,非常希望大家能够看到并给出建议。

参考博文:

  http://www.cnblogs.com/zishengY/p/6892345.html,http://blog.csdn.net/luckarecs/article/details/7165472

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-05-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 性能优化的 9 种姿势,面试再也不怕了!
Mysql是一种关系型数据库,可以很好地支持大数据量的存储,但是一般来说,数据库中的表越小,在它上面执行的查询也就越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度舍得尽可能小。
程序员小猿
2021/11/23
1.1K0
​Mysql数据库查询好慢,除了索引,还能因为什么?
mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题。
小白debug
2022/06/20
6030
​Mysql数据库查询好慢,除了索引,还能因为什么?
不删库不跑路 -- 数据库优化
数据库Mysql在后端开发工作中,必不可少,关于mysql优化的知识也是后端工程师必备的。接下来小强将分阶段的向大家介绍关于关于Mysql优化的相关知识。
程序员小强
2019/09/20
5850
不删库不跑路 -- 数据库优化
hhdb数据库介绍(9-29)
Load data或into outfile时文件的本地读取/写入路径(绝对路径),为空时则默认为程序目录下的HotDB-TEMP子目录,配置路径后,无论Load data或into outfile时是否指定路径,均以配置路径为准。
恒辉信达
2024/12/04
920
5个MySQL优化技巧,你一定用的上
所谓的性能优化,一般针对的是MySQL查询的优化。既然是优化查询,我们自然要先知道查询操作要经过哪些环节,然后思考可以在哪些环节进行优化。
蝉沐风
2022/08/17
1.1K0
5个MySQL优化技巧,你一定用的上
MySQL优化的5个维度
所谓的性能优化,一般针对的是MySQL查询的优化。既然是优化查询,我们自然要先知道查询操作要经过哪些环节,然后思考可以在哪些环节进行优化。
蝉沐风
2022/08/22
5180
MySQL优化的5个维度
干货!MySQL优化原理分析及优化方案总结
说起MySQL优化的话,想必大部分人都不陌生了。在我们的记忆储备里也早已记住了这些关键词:避免使用SELECT*、避免使用NULL值的判断、根据需求适当的建立索引、优化MySQL参数......但是你对于这些优化技巧是否真正的掌握了及其相应的工作原理是否吃透了呢?在我们的实际开发过程中你能充分应用到吗?我觉得还有待考察。所以,本文将详细介绍MySQL优化技巧以及其相应的技术原理,希望大家看完以后,能更清楚直接的了解这些优化方案,并应用到我们的工作岗位中。
用户1516716
2020/12/17
9290
MySQL 之数据库优化
不管对于哪种服务,对于其优化,无非是从两个方面着手,第一个是对于硬件方面的优化,第二个是对系统以及服务本身的优化。 1、查询连接MySQL服务器的次数
小手冰凉
2020/06/02
1.4K0
这个MySQL优化原理剖析,比照X光还清楚
| 作者 沈启超,19年硕士毕业于东南大学,目前在腾讯CSIG企业产品部担任后台开发,同时也参与公司内部存储开源组件MySync的开发。 ---- 前言:MySQL架构体系 首先分享实验前的基础知识,MySQL主要分为Server层与存储引擎层。 Server层主要包含连接器、检索内存、分析器、优化器、执行器等,所有跨存储引擎的功能均于这一层构建,例如存储过程、触发器、视图,函数等,有一个标准化的binglog日志模块。 存储引擎负责数据的存储与存取,使用可更换的插件式架构,拥有InnoDB、MyISA
腾讯云数据库 TencentDB
2020/09/25
7580
万字总结:学习MySQL优化原理,这一篇就够了!
说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原
Java高级架构
2018/04/19
4.8K0
万字总结:学习MySQL优化原理,这一篇就够了!
你不得不知道的 MySQL 优化原理(一)
说起MySQL的查询优化,相信大家收藏了一堆奇淫技巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型….. 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必。因而理解这些优化建议背后的原理就尤为重要,希望本文能让你重新审视这些优化建议,并在实际业务场景下合理的运用。
哲洛不闹
2018/09/14
7090
你不得不知道的 MySQL 优化原理(一)
数据库SQL优化大总结1之- 百万级数据库优化方案
小编最近几天一直未出新技术点,是因为小编在忙着总结整理数据库的一些优化方案,特此奉上,优化总结较多,建议分段去消化,一口吃不成pang(胖)纸 一、百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 最好不要给数据库留NULL,尽
码神联盟
2018/03/16
5.7K1
数据库SQL优化大总结1之- 百万级数据库优化方案
MySQL数据库优化的八种方式(经典必看)
MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。
Java编程指南
2019/08/02
7410
数据库性能优化-索引与sql相关优化
     索引是帮助MySQL高效获取数据的数据结构。索引是在存储引擎中实现的,所以每种存储引擎中的索引都不一样。如MYISAM和InnoDB存储引擎只支持BTree索引;MEMORY储存引擎可以支持HASH和BTREE索引。
洋仔聊编程
2019/01/15
2K0
MySQL批量插入数据,一次插入多少行数据效率最高?
我们在操作大型数据表或者日志文件的时候经常会需要写入数据到数据库,那么最合适的方案就是数据库的批量插入。只是我们在执行批量操作的时候,一次插入多少数据才合适呢?假如需要插入的数据有百万条,那么一次批量插入多少条的时候,效率会高一些呢?这里博主和大家一起探讨下这个问题,应用环境为批量插入数据到临时表。
用户8949263
2022/04/08
9K0
Mysql进阶优化篇01——四万字详解数据库性能分析工具(深入、全面、详细,收藏备用)
数据库的优化整个流程划分成了 观察(Show status) 和 行动(Action) 两个部分。数据库的优化可以总结为下图。字母 S 的部分代表观察(会使用相应的分析工具),字母 A 代表的部分是行动(对应分析可以采取的行动)。
半旧518
2022/10/26
1.1K0
Mysql进阶优化篇01——四万字详解数据库性能分析工具(深入、全面、详细,收藏备用)
重生之MySQL SQL 执行的 7 大关键步骤,解锁新技能
我的名字是萧剑臣,一个 34 岁的普通人。2024 年接近尾声,浅圳这座钢铁森林依旧喧嚣。
码哥字节
2024/11/23
770
重生之MySQL SQL 执行的 7 大关键步骤,解锁新技能
数据库优化方案之SQL脚本优化
随着数据库数据越来越大,数据单表存在的数据量也就随之上去了,那么怎么样让我们的脚本查询数据更快呢?
用户1112962
2019/11/15
1.5K0
MySQL 数据库规范--开发篇
table name = test、column1 = id、column2 = name.
用户1081422
2020/04/08
1.7K0
数据库篇
SQL 标准定义的四个隔离级别为: read uncommited :读到未提交数据 read committed:脏读,不可重复读 repeatable read:可重读 serializable :串行事物
Li_XiaoJin
2022/06/10
1.1K0
数据库篇
推荐阅读
相关推荐
MySQL 性能优化的 9 种姿势,面试再也不怕了!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档