数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷。

一、优化一览图

二、优化

笔者将优化分为了两大类:软优化和硬优化。软优化一般是操作数据库即可;而硬优化则是操作服务器硬件及参数设置。

1、软优化

1)查询语句优化

首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息。

例:

DESC SELECT * FROM `user`

显示:

其中会显示索引和查询数据读取数据条数等信息。

2)优化子查询

在MySQL中,尽量使用JOIN来代替子查询。因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高。

3)使用索引

索引是提高数据库查询速度最重要的方法之一,使用索引的三大注意事项包括:

  • LIKE关键字匹配'%'开头的字符串,不会使用索引;

  • OR关键字的两个字段必须都是用了索引,该查询才会使用索引;

  • 使用多列索引必须满足最左匹配。

4)分解表

对于字段较多的表,如果某些字段使用频率较低,此时应当将其分离出来从而形成新的表。

5)中间表

对于将大量连接查询的表可以创建中间表,从而减少在查询时造成的连接耗时。

6)增加冗余字段

类似于创建中间表,增加冗余也是为了减少连接查询。

7)分析表、检查表、优化表

分析表主要是分析表中关键字的分布;检查表主要是检查表中是否存在错误;优化表主要是消除删除或更新造成的表空间浪费。

分析表:使用 ANALYZE 关键字,如ANALYZE TABLE user

  • Op:表示执行的操作;

  • Msg_type:信息类型,有status、info、note、warning、error;

  • Msg_text:显示信息。

检查表: 使用 CHECK关键字,如CHECK TABLE user [option]。option 只对MyISAM有效。共五个参数值:

  • QUICK:不扫描行,不检查错误的连接;

  • FAST:只检查没有正确关闭的表;

  • CHANGED:只检查上次检查后被更改的表和没被正确关闭的表;

  • MEDIUM:扫描行,以验证被删除的连接是有效的,也可以计算各行关键字校验和;

  • EXTENDED:最全面的的检查,对每行关键字全面查找。

优化表:使用OPTIMIZE关键字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;

LOCAL|NO_WRITE_TO_BINLOG都是表示不写入日志,优化表只对VARCHAR、BLOB和TEXT有效,通过OPTIMIZE TABLE语句可以消除文件碎片,在执行过程中会加上只读锁。

2、硬优化

1)硬件三件套

  • 配置多核心和频率高的cpu,多核心可以执行多个线程;

  • 配置大内存,提高内存,即可提高缓存区容量,因此能减少磁盘I/O时间,从而提高响应速度;

  • 配置高速磁盘或合理分布磁盘:高速磁盘提高I/O,分布磁盘能提高并行操作的能力。

2)优化数据库参数

优化数据库参数可以提高资源利用率,从而提高MySQL服务器性能。MySQL服务的配置参数都在my.cnf或my.ini,下面列出性能影响较大的几个参数:

  • key_buffer_size:索引缓冲区大小;

  • table_cache:能同时打开表的个数;

  • query_cache_size和query_cache_type:前者是查询缓冲区大小,后者是前面参数的开关,0表示不使用缓冲区,1表示使用缓冲区,但可以在查询中使用SQL_NO_CACHE表示不要使用缓冲区,2表示在查询中明确指出使用缓冲区才用缓冲区,即SQL_CACHE;

  • sort_buffer_size:排序缓冲区。

更多参数:

https://www.mysql.com/cn/why-mysql/performance/index.html

3)分库分表

因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响。

另外一个,压力过大把你的数据库给搞挂了怎么办?

所以此时你必须得对系统做分库分表+读写分离,也就是把一个库拆分为多个库,部署在多个数据库服务上,这时作为主库承载写入请求。然后每个主库都挂载至少一个从库,由从库来承载读请求。

4)缓存集群

如果用户量越来越大,此时你可以不停的加机器,比如说系统层面不停加机器,就可以承载更高的并发请求。

然后数据库层面如果写入并发越来越高,就扩容加数据库服务器,通过分库分表是可以支持扩容机器的,如果数据库层面的读并发越来越高,就扩容加更多的从库。

但是这里有一个很大的问题:

数据库其实本身不是用来承载高并发请求的,所以通常来说,数据库单机每秒承载的并发就在几千的数量级,而且数据库使用的机器都是比较高配置,比较昂贵的机器,成本很高。

如果你就是简单的不停的加机器,其实是不对的。

所以在高并发架构里通常都有缓存这个环节,缓存系统的设计就是为了承载高并发而生。单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级。

你完全可以根据系统的业务特性,对那种写少读多的请求,引入缓存集群。

具体来说,就是在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求。这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。

三、结语

一个完整而复杂的高并发系统架构中,一定会包含各种复杂的自研基础架构系统和各种精妙的架构设计,因此一篇小文顶多具有抛砖引玉的效果。但是总得来看,数据库优化的思想差不多就这些了。希望能对大家有所帮助。

作者:赵栩彬

来源:https://segmentfault.com/a/1190000018631870

抛开复杂的架构设计,MySQL优化思想基本都在这了相关推荐

  1. mysql架构设计书籍推荐_最近很火的MySQL:抛开复杂的架构设计,MySQL优化思想基本都在这...

    摘要: 冲区才用缓冲区,即SQL_CACHE:sort_buffer_size:排序缓冲区.3)分库分表因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响. ...

  2. 最近很火的MySQL:抛开复杂的架构设计,MySQL优化思想基本都在这

    优化一览图 优化 笔者将优化分为了两大类:软优化和硬优化.软优化一般是操作数据库即可:而硬优化则是操作服务器硬件及参数设置. 1.软优化 1)查询语句优化 首先我们可以用EXPLAIN或DESCRIB ...

  3. 【SDCC讲师专访】58同城孙玄:一切抛开业务的架构设计都是耍流氓

    本期我们采访的讲师是来自58同城高级系统架构师&技术负责人孙玄,他是58的技术委员会架构组主任,产品技术学院优秀讲师,代表58同城参与多次对外演讲. 58同城高级系统架构师,技术委员会架构组主 ...

  4. 数据库架构设计与优化

    数据库架构设计与优化 导航: 数据库架构设计与优化 一. 影响数据库性能的原因 1.1 影响数据库的因素 1.2 影响MYSQL性能的因素有哪些? 1.3 事务 二. 什么影响了MYSQL性能 2.1 ...

  5. 一文带你了解 Spark 架构设计与原理思想

    卷友们,大家好 ~ 我是 Alex .之前已经陆续输出了 Hadoop三大核心组件 的 架构思想和原理 和 Hive架构设计和原理 ,每篇都受到了读者小伙伴们的一致好评 ~ 感谢大家的支持.大家可能已 ...

  6. 【博士论文】深度卷积神经网络架构设计及优化问题研究

    来源:专知 本文为论文介绍,建议阅读5分钟 近年来,深度卷积神经网络在计算机视觉领域取得了革命性的进展,并被广泛地应用到图像分类.物体检测.实例分割等经典的计算机视觉问题当中. 来自南京理工大学的李翔 ...

  7. 百亿级日志系统架构设计及优化

    作者:杨津萍,大数据架构师,从业十余年,专攻 Web 架构及大数据架构. 来自:51cto技术栈(ID:blog51cto) " 日志数据是最常见的一种海量数据,以拥有大量用户群体的电商平台 ...

  8. CynosDB for PostgreSQL 一主多读架构设计及优化[内附独家PPT]

    点击上方"云加社区",选择"置顶或星标" 学习技术干货 提升自我能力 本文整理自腾讯云云+社区主办的"腾讯云自研数据库 CynosDB 交流会&quo ...

  9. 以电商网站为例,谈大型分布式架构设计与优化

    本文大纲: 1. 使用电商案例的原因 2. 电商网站需求 3. 网站初级架构 4. 系统容量估算 5. 网站架构分析 6. 网站架构优化 本文主题为电商网站架构案例,将介绍如何从电商网站的需求,到单机 ...

  10. 微服务架构-设计总结,看了都说好!

    点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Sometimes, the same thing, we can ...

最新文章

  1. 耗材领用登记系统php_简单说一说,实验室管理系统LIMS系统功能描述吧
  2. Nginx文件描述符泄露?浅析FD_CLOEXEC文件描述符标志
  3. python程序结构有哪几种_三、python程序结构之分支结构
  4. Java基础-初识面向对象编程(Object-Oriented-Programming)
  5. Linux平台安装xtools
  6. 多源异构数据_构建数字孪生城市的CIM数据平台哪家强?
  7. 程序员精美简历Top榜—面试必备
  8. 干货 | 带你解析计算机视觉热门技术—目标检测与追踪
  9. window直接运行不需要环境的软件是什么语言开发的_C语言为何不会过时?你需要掌握多少种语言?_C 语言...
  10. java获取响应网页源代码
  11. Altium designer—各类USB封装大全
  12. OD调试初体验—关闭x86版winrar广告弹窗
  13. 【SpringBoot新手篇】SpringBoot优雅文件上传方式
  14. 微软商店无法连接网络的问题解决
  15. 目前见到的最傻瓜全面的STRUTS入门教程^_^
  16. <C++>初识STL —— 标准模板库
  17. 如何进行Sublime Text插件的升级和卸载?
  18. StringBuffer是安全的吗?
  19. 【我的渲染技术进阶之旅】基于Filament渲染引擎绘制一个不停旋转的彩色矩形
  20. Vue 循环map对象拿到key值和value值

热门文章

  1. vscode初次配置
  2. 外网不能访问图片的问题
  3. STSegmentedControl
  4. nagios 飞信(fetion) 短信报警
  5. linux逻辑表达式,循环结构,函数
  6. llustrator 教程,如何在 Illustrator 中对齐内容?
  7. inDesign 教程,如何调整布局元素的大小?
  8. 如何在 Mac 上的“通知中心”中添加和自定小组件?
  9. 在MAC环境下之以太坊(ethereum)开发环境安装
  10. 如何解决 MacBook Pro Touch ID不起作用?