| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL优化的5个维度 -> 正文阅读 |
|
[大数据]MySQL优化的5个维度 |
面试官如果问你:你会从哪些维度进行MySQL性能优化?你会怎么回答? 所谓的性能优化,一般针对的是MySQL查询的优化。既然是优化查询,我们自然要先知道查询操作要经过哪些环节,然后思考可以在哪些环节进行优化。 我之前写过一条SQL查询语句是如何执行的?,感兴趣的朋友可以阅读一下,我用其中的一张图展示查询操作需要经历的基本环节。 下面从5个角度介绍一下MySQL优化的一些策略。 1. 连接配置优化处理连接是MySQL客户端和MySQL服务端亲热的第一步,第一步都迈不好,也就别谈后来的故事了。 既然连接是双方的事情,我们自然从服务端和客户端两个方面来进行优化喽。 1.1 服务端配置服务端需要做的就是尽可能地多接受客户端的连接,或许你遇到过 我们可以从两个方面解决连接数不够的问题:
1.2 客户端优化客户端能做的就是尽量减少和服务端建立连接的次数,已经建立的连接能凑合用就凑合用,别每次执行个SQL语句都创建个新连接,服务端和客户端的资源都吃不消啊。 解决的方案就是使用连接池来复用连接。 常见的数据库连接池有 但是需要注意的是连接池并不是越大越好,比如 对于每一个连接,服务端会创建一个单独的线程去处理,连接数越多,服务端创建的线程自然也就越多。而线程数超过CPU个数的情况下,CPU势必要通过分配时间片的方式进行线程的上下文切换,频繁的上下文切换会造成很大的性能开销。 Hikari官方给出了一个 2. 架构优化2.1 使用缓存系统中难免会出现一些比较慢的查询,这些查询要么是数据量大,要么是查询复杂(关联的表多或者是计算复杂),使得查询会长时间占用连接。 如果这种数据的实效性不是特别强(不是每时每刻都会变化,例如每日报表),我们可以把此类数据放入缓存系统中,在数据的缓存有效期内,直接从缓存系统中获取数据,这样就可以减轻数据库的压力并提升查询效率。 2.2 读写分离(集群、主从复制)项目的初期,数据库通常都是运行在一台服务器上的,用户的所有读写请求会直接作用到这台数据库服务器,单台服务器承担的并发量毕竟是有限的。 针对这个问题,我们可以同时使用多台数据库服务器,将其中一台设置为为小组长,称之为
使用集群必然面临一个问题,就是多个节点之间怎么保持数据的一致性。毕竟写请求只往 主从复制技术来了!我在一条SQL更新语句是如何执行的?中粗浅地介绍了一下binlog日志,我直接搬过来了。
这种集群的架构对减轻主数据库服务器的压力有非常好的效果,但是随着业务数据越来越多,如果某张表的数据量急剧增加,单表的查询性能就会大幅下降,而这个问题是读写分离也无法解决的,毕竟所有节点存放的是一模一样的数据啊,单表查询性能差,说的自然也是所有节点性能都差。 这时我们可以把单个节点的数据分散到多个节点上进行存储,这就是分库分表。 2.3 分库分表分库分表中的节点的含义比较宽泛,要是把数据库作为节点,那就是分库;如果把单张表作为节点,那就是分表。 大家都知道分库分表分成垂直分库、垂直分表、水平分库和水平分表,但是每次都记不住这些概念,我就给大家详细说一说,帮助大家理解。 2.3.1 垂直分库在单体数据库的基础上垂直切几刀,按照业务逻辑拆分成不同的数据库,这就是垂直分库啦。 2.3.2 垂直分表垂直分表就是在单表的基础上垂直切一刀(或几刀),将一个表的多个字短拆成若干个小表,这种操作需要根据具体业务来进行判断,通常会把经常使用的字段(热字段)分成一个表,不经常使用或者不立即使用的字段(冷字段)分成一个表,提升查询速度。 拿上图举例:通常情况下商品的详情信息都比较长,而且查看商品列表时往往不需要立即展示商品详情(一般都是点击详情按钮才会进行显示),而是会将商品更重要的信息(价格等)展示出来,按照这个业务逻辑,我们将原来的商品表做了垂直分表。 2.3.3 水平分表把单张表的数据按照一定的规则(行话叫分片规则)保存到多个数据表上,横着给数据表来一刀(或几刀),就是水平分表了。 2.3.4 水平分库水平分库就是对单个数据库水平切一刀,往往伴随着水平分表。 2.3.5 总结水平分,主要是为了解决存储的瓶颈;垂直分,主要是为了减轻并发压力。 2.4 消息队列削峰通常情况下,用户的请求会直接访问数据库,如果同一时刻在线用户数量非常庞大,极有可能压垮数据库(参考明星出轨或公布恋情时微博的状态)。 这种情况下可以通过使用消息队列降低数据库的压力,不管同时有多少个用户请求,先存入消息队列,然后系统有条不紊地从消息队列中消费请求。 3. 优化器——SQL分析与优化处理完连接、优化完缓存等架构的事情,SQL查询语句来到了解析器和优化器的地盘了。在这一步如果出了任何问题,那就只能是SQL语句的问题了。 只要你的语法不出问题,解析器就不会有问题。此外,为了防止你写的SQL运行效率低,优化器会自动做一些优化,但如果实在是太烂,优化器也救不了你了,只能眼睁睁地看着你的SQL查询沦为慢查询。 3.1 慢查询慢查询就是执行地很慢的查询(这句话说得跟废话似的。。。),只有知道MySQL中有哪些慢查询我们才能针对性地进行优化。 因为开启慢查询日志是有性能代价的,因此MySQL默认是关闭慢查询日志功能,使用以下命令查看当前慢查询状态
除了上面两个变量,我们还需要确定“慢”的指标是什么,即执行超过多长时间才算是慢查询,默认是
3.1.1 打开慢日志有两种打开慢日志的方式
此种修改方式系统重启后依然有效
3.1.2 慢日志分析MySQL不仅为我们保存了慢日志文件,还为我们提供了慢日志查询的工具
然后我们查询用时最多的1条慢查询:
其中,
更多关于 3.2 查看运行中的线程我们可以运行 其中,
3.3 查看服务器运行状态使用
3.4 查看存储引擎运行信息
例如:
上面这条语句可以展示innodb存储引擎的当前运行的各种信息,大家可以据此找到MySQL当前的问题,限于篇幅不在此意义说明其中信息的含义,大家只要知道MySQL提供了这样一个监控工具就行了,等到需要的时候再来用就好。 3.5 EXPLAIN执行计划通过慢查询日志我们可以知道哪些SQL语句执行慢了,可是为什么慢?慢在哪里呢? MySQL提供了一个执行计划的查询命令
这篇文章主要是从宏观上多个角度介绍MySQL的优化策略,因此这里不详细说明 3.6 SQL与索引优化3.6.1 SQL优化SQL优化指的是SQL本身语法没有问题,但是有实现相同目的的更好的写法。比如:
针对最后一条举个简单的例子,下面两条语句能实现同样的目的,但是第二条的执行效率比第一条执行效率要高得多(存储引擎使用的是InnoDB),大家感受一下:
3.6.2 索引优化为慢查询创建适当的索引是个非常常见并且非常有效的方法,但是索引是否会被高效使用又是另一门学问了。 我之前写过一篇用好MySQL索引,你必须知道的一些事情 ,感兴趣的读者可以看一下。 4. 存储引擎与表结构4.1 选择存储引擎一般情况下,我们会选择MySQL默认的存储引擎存储引擎 建议根据不同的业务选择不同的存储引擎,例如:
4.2 优化字段字段优化的最终原则是:使用可以正确存储数据的最小的数据类型。 4.2.1 整数类型MySQL提供了6种整数类型,分别是
不同的存储类型的最大存储范围不同,占用的存储的空间自然也不同。 例如,是否被删除的标识,建议选用 4.2.2 字符类型你是不是直接把所有字符串的字段都设置为 如果不确定字段的长度,肯定是要选择 4.2.3 非空非空字段尽量设置成 因为 4.2.4 不要用外键、触发器和视图功能这也是「阿里巴巴开发手册」中提到的原则。原因有三个:
4.2.5 图片、音频、视频存储不要直接存储大文件,而是要存储大文件的访问地址。 4.2.6 大字段拆分和数据冗余大字段拆分其实就是前面说过的垂直分表,把不常用的字段或者数据量较大的字段拆分出去,避免列数过多和数据量过大,尤其是习惯编写 字段冗余原则上不符合数据库设计范式,但是却非常有利于快速检索。比如,合同表中存储客户id的同时可以冗余存储客户姓名,这样查询时就不需要再根据客户id获取用户姓名了。因此针对业务逻辑适当做一定程度的冗余也是一种比较好的优化技巧。 5. 业务优化严格来说,业务方面的优化已经不算是MySQL调优的手段了,但是业务的优化却能非常有效地减轻数据库访问压力,这方面一个典型例子就是淘宝,下面举几个简单例子给大家提供一下思路:
MySQL优化的总结写到此就结束了,其中有不少细节没有提及,多少让我感觉这篇文章不完美。但是有些知识点掰开讲又太多了,不可能一下子全部写下,之后再好好写吧。 我是蝉沐风,一个认真写文章的技术人,下期见! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 5:27:56- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |