如今互联网行业用的最多就是 MySQL,不管项目大小都会用到它,然而 MySQL 其实玩的就是优化和架构设计。
本场 Chat 首先会带领大家畅聊 MySQL 性能优化之查询优化,了解 MySQL 之查询优化有那些,并且后期运用在项目中。本场 Chat 您将学到如下内容:
本篇文章将阐述 MySQL 查询优化相关的东西,了解查询优化器、查询优化的基本思路、查询的基本原则、索引相关的优化。
查询优化器的任务是发现执行 SQL 查询的最佳方案。大多数查询优化器,要么基于规则、要么基于成本。大多数查询优化器,包含 MySQL 的查询优化器,总或多或少地在所有可能的查询评估方案中搜索最佳方案。
MySQL 中 MySQL Query Optimizer 是优化器的核心,当 MySQL 数据拿到一个 Query 语句之后会交给 Query Optimizer 去解析,并产生一个最优的执行计划(这个是 Optimizer 认为是最优的,但不一定是真正最优的,就跟 Oracle 数据库会估算错 rows 一样),然后数据库按照这个执行计划去执行查询语句。在 SQL 语句整个执行过程中,Optimizer 是最耗时的,但是也有第三方工具为了提高性能绕开 MySQL 的 Query Optimizer 模块,比如:handlersocket。
对于多表关联查询,MySQL 优化器所查询的可能方案数随查询中引用的表的数目成指数增长。对于小数量的表,这不是一个问题。然而,当提交的查询需要的结果集很大时,查询优化所花的时间会很容易地成为服务器性能的瓶颈。
查询优化的一个更加灵活的方案时容许用户控制优化器详细地搜索最佳查询评估方案。一般思想是调查的方案越少,它编译一个查询所花费的时间越少。另外,由于优化器跳过一些方案,它可能错过一个最佳方案。优化器关于方案数量评估的行为可以通过两个系统变量来控制:
optimizer_prune_level
变量告诉优化器根据对每个表访问的行数的估计跳过一些方案。我们的试验显示该类 “有根据的猜测” 很少错过最佳方案,并且可以大大降低查询编辑次数。这就是为什么默认情况该选项为 on(optimizer_prune_level=1)
。然而,如果你认为优化器错过了一个更好的查询方案,则该选项可以关闭 (optimizer_prune_level=0)
,风险是查询编辑花费的时间更长。请注意即使使用该启发,优化器仍然可以探测呈指数数目的方案。
timizer_search_depth
变量告诉优化器对于每个未完成的 “未来的” 方案,应查看多深,以评估是否应对它进一步扩大。optimizer_search_depth
值较小会使查询编辑次数大大减小。例如,如果 optimizer_search_depth
接近于查询中表的数量,对 12、13 或更多表的查询很可能需要几小时甚至几天的时间来编译。同时,如果用 optimizer_search_depth
等于 3 或 4 编辑,对于同一个查询,编译器编译时间可以少于 1 分钟。如果不能确定合理的 optimizer_search_depth
值,该变量可以设置为 0,告诉优化器自动确定该值。
不管做项目设计还是产品设计都需要先有思路,才能规避一些问题。当然 MySQL 查询优化也需要研发或者 DBA 拥有一些思路,唯有思路指导书写,才会更加合理。
应该优化并发高的 Query 语句,不至于高并发下,由于 SQL 导致应用程序卡死,比如 php-fpm 的大量等待,而且一个高并发的 Query 语句,如果走错执行计划,本来只需要扫描几百行,结果扫描了几百万行,可能会有灾难性的后果,更加会导致业务卡顿,尤其是核心业务下出现的高并发 Query 语句。
根据 explain extended SQL 分析查询语句,就能查看执行计划,这个时候需要关注执行计划中的一些要素:
select type
type 扫描方式
当发现有慢 Query 语句时,需要定位到底是哪里慢,CPU 还是 IO 等:
mysql>set profiling=1;mysql>show profiles;mysql>show profile cpu,block io for query n;
做 join 查询时,驱动表,一定是条件限定后记录较少的表。
MySQL 的 join 只有一种算法 nested loop 也就是程序中的 for 循环,通过嵌套循环实现,驱动结果集越大,所需要循环的次数越多,访问被驱动表的次数也越多。降低 IO 同时降低 CPU。
只查询需要的列,可以让 IO 降低,列和排序算法也有关系。
前提是用 a 条件 查询出结果 用 b 条件查询出结果,a、b 都用查询出结果,这三次结果都一样。
到底是用 a 条件还是 b 条件,还是两个条件都限定,只能看执行计划。
万事万物都有利弊,一个东西的出现,比如会在不同场景下有好好坏,就看如何权衡。
好处:
坏处:
综上所述,大致简单明了的阐述了 MySQL 查询优化一些相关的东西,至少对于中小型企业,可以作为研发人员的数据库规范,避免后期迁移或扩容时的一些问题。一切相关问题可以后续读者圈交流,谢谢大家耐心看完。
本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。
阅读全文: http://gitbook.cn/gitchat/activity/5addf88c00ce3f623b8346d7
您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。
文章浏览阅读469次。1、尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容,这部分时间包括下载页面中的图像、样式表、脚本、Flash等。通过减少页面中的元素可以减少HTTP请求的次数,这是提高网页速度的关键步骤。减少页面组件的方法其实就是简化页面设计。那么有没有一种方法既能保持页面内容的丰富性又能达到加快响应时间的目的呢?这里有几条减少HTTP请求次数同时又可能保持页面内容丰富的技术。1、合并文_雅虎34条
文章浏览阅读463次。猜你喜欢0、2021年轻人性生活调研报告1、如何搭建一套个性化推荐系统?2、从零开始搭建创业公司后台技术栈3、2021年10月份热门报告免费下载4、微博推荐算法实践与机器学习平台演进5、..._prop: pre-training with representative words prediction for ad-hoc retrieval
文章浏览阅读7.8k次,点赞2次,收藏34次。STM32+BM8563时钟芯片不走时问题解决(含配置代码)一、寄存器BM8563是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。最大总线速度为400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动递增。BM8563有16个寄存器,其中11个是BCD格式。配置是要注意值范围,不能超出。更多具体应用请看官方手册。二、晶振晶振选择非常重要。32.768不用说了,主要是ESR值,不能小了,也不能太大_bm8563esa stm32 代码
文章浏览阅读1.6w次,点赞27次,收藏170次。原文代码+Food_5K数据集,提取码:zws7什么是迁移学习当数据集没有大到足以训练整个CNN网络时,通常可以对预训练好的imageNet网络(如VGG16,Inception-v3等)进行调整以适应新任务。通常来说,迁移学习有两种类型:特征提取 微调(fine-tuning)第一种迁移学习是将预训练的网络视为一个任意特征提取器。图片经过输入层,然后前向传播,最后在指定层停......_vgg16迁移学习
文章浏览阅读643次。作者:追梦1819原文:https://blog.csdn.net/weixin_39759846/article/details/94428903版权声明:本文为博主原创文章,转载请附上博文链接!引言 邮件的重要性也无需多说了,例如注册验证,消息通知,系统异常提醒等,都离不开邮件的发送。版本信息JDK:1.8 SpringBoot :2.1.4.RELEASE m..._springboot mail
文章浏览阅读1.6k次,点赞2次,收藏7次。PID 控制器代码实现PID 控制器代码实现效果展示实现代码PID 控制器代码实现PID:比列(Proportion),积分(Integral),微分(Differential)偏差 e:某时刻的系统的输出值(output)和目标值(target)之差Kp: 比列系数Ki: 积分系数Kd: 微分系数Ti: 积分时间Td: 微分时间比例系数Kp:增大比例系数使系统反应灵敏,调节速度加快,并且可以减小稳态误差。但是比例系数过大会使超调量增大,振荡次数增加,调节时间加长,动态性能变坏,比例系数_pid源码
文章浏览阅读2.7w次,点赞8次,收藏52次。vue获取各种格式当前时间,介绍了两种方式:new Date()、$moment_vue获取当前时间
文章浏览阅读323次。公众号关注「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux !云原生正在吞并软件世界,容器改变了传统的应用开发模式,如今研发人员不仅要构建应用,还要使用 Dockerf..._dockerfile online editor
文章浏览阅读998次。/usr/local/mmseg/etc这个目录下1、了解几个文件mmseg.ini unigram.txt uni.libuni.lib --------- 编译后的词库unigram.txt ---- 原词库给人看的, 在这里面添加词库2、添加词条海斯队 1x:1丝路 1x:1令人心悸 1x:13、重新编_mmseg 新增词库
文章浏览阅读1.3k次。一、原始检测方法具体内容如下: 判别特征点pp是否是一个特征点,可以通过判断以该点为中心画圆,该圆过16个像素点。设在圆周上的16个像素点中是否最少有nn个连续的像素点满足都比Ip+tIp+t大,或者都比Ip−tIp−t小。(这里IpIp指的点pp的灰度值,tt是一个阈值)如果满足这样的要求,则判断pp是一个特征点,否则pp不是。在原论文中nn的值一般设为12。 如下图所示: 由于在检测特征点时..._fast 特征检测
文章浏览阅读3.7k次。Oracle查询客户端编码集SQL> select userenv('language') from dual; USERENV('LANGUAGE')----------------------------------------------------AMERICAN_AMERICA.ZHS16GBK_oracle 获取机器码
文章浏览阅读458次。最近在重构公司以前产品的前端代码,摈弃了以前的session-cookie鉴权方式,采用token鉴权,忙里偷闲觉得有必要对几种常见的鉴权方式整理一下。 目前我们常用的鉴权有四种: HTTP Basic Authenticationsession-cookieT..._强鉴权