`
BradyZhu
  • 浏览: 261175 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【总结】MySQL性能优化

 
阅读更多
1,MySQL基础
- MySQL物理文件组成
- MySQL逻辑架构
- MySQL自带工具
2,MySQL存储引擎
- MyISAM
- Innodb
- NDBCluster
3,MySQL性能优化
- 硬件层优化
- OS层优化
- MySQL层优化分析
- 系统架构及实现对性能的影响
-不适合放在数据库存放
-二进制多媒体数据
-流水队列数据
-大文本数据
-适合缓存
-系统各种配置规则数据
-活跃用户的基本信息数据
-活跃用户的个性化定制信息数据
-准实时的统计信息数据
-其他一些访问频繁但变更较少的数据
-常见设计问题
-Cache系统不合理利用导致Cache命中率低下造成数据库访问量的增加,同时也浪费了Cache系统的硬件资源投入
-过度依赖面向对象思想,对系统
-可扩展性的过度追求,促使系统设计的时候将对象拆得过于离散,造成系统中大量的复杂Join语句,而MySQL Server 在各数据库系统中的主要优势在于处理简单逻辑的查询,这与其锁定的机制也有较大关系
-对数据库的过度依赖,将大量更适合存放于文件系统中的数据存入了数据库中,造成数据库资源的浪费,影响到系统的整体性能,如各种日志信息
-过度理想化系统的用户体验,使大量非核心业务消耗过多的资源,如大量不需要实时更新的数据做了实时统计计
-归结为过渡依赖嵌套循环的使用或者说是过渡弱化SQL语句的功能造成性能消耗过多
-Query语句对性能的影响
- 两表分页排序查询:用子查询,得到主表的排序分页结果,在Join第二张表
- Schema设计对性能的影响
-大字段拆分
-数据冗余
- 硬件环境对性能的影响
-OLTP 应用系统(on-line transaction processing:并发量大,整体数据量比较多,但每次访问的数据比较少,且访问的数据比较离散,活跃数据占总体数据的比例不是太大
-大内存容量来尽可能多的将活跃数据cache到内存中
-虽然IO访问非常频繁,但是每次访问的数据量较少且很离散,那么我们对磁盘存储的要求是IOPS现要很好,吞吐量是次要因素
-并发量很高,CPU每秒所要处理的请求自然也就很多,所以CPU处理能力需要比较强劲
-虽然与客户端的每次交互的数据量并不是特别大,但是网络交互非常频繁,所以主机与客户端交互网络设备对流量能力也要求不能太弱
-OLAP 应用系统(On-Line Analytical Processing:数据量非常大,并发访问不多,但每次访问所需要检索的数据量都比较多,而且数据访问相对较为集中,没有太明显的活跃数据概念
-数据量非常大,所以磁盘存储系统的单位容量需要尽量大一些
-单次访问数据量较大,而且访问数据比较集中,那么对IO 系统的性能要求是需要有尽可能大的每秒IO吞吐量,所以应该选用每秒吞吐量尽可能大的磁盘
-虽然IO 性能要求也比较高,但是并发请求较少,所以CPU 处理能力较难成为性能瓶颈,所以CPU处理能力没有太苛刻的要求
-虽然每次请求的访问量很大,但是执行过程中的数据大都不会返回给客户端,最终返回给客户端的数据量都较小,所以和客户端交互的网络设备要求并不是太高
-OLAP 系统由于其每次运算过程较长,可以很好的并行化,所以一般的OLAP 系统都是由多台主机构成的一个集群,而集群中主机与主机之间的数据交互量一般来说都是非常大的,所以在集群中主机之间的网络设备要求很高
- MySQL层优化
- MySQL数据库锁
- 行级锁定(row-level)
- Innodb
- 共享锁(意向)
- 排他锁(意向)
- 原理:“NEXT-KEY locking”(间隙锁
-当Query无法利用索引的时候,Innodb会放弃使用行级别锁定改用表级别的锁定,造成并发性能的降低
-当Query 使用的索引并不包含所有过滤条件的时候,数据检索使用到的索引键所只想的数据可能有部分并不属于该Query 的结果集的行列,但是也会被锁定,因为间隙锁锁定的是一个范围,而不是具体的索引键
- 当Query 在使用索引定位数据的时候,如果使用的索引键一样但访问的数据行不同的时候(索引只是过滤条件的一部分),一样会被锁定
- NDB Cluster
-锁定对象的颗粒度很小
- 锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能
- 由于锁定资源的颗粒度很小,所以每次获取锁释放锁要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁
- 表级锁定(table-level)
- MyISAM
- MyISAM 存储引擎使用的锁定机制完全是由MySQL 提供的表级锁定实现
-大颗粒度的锁定机制
-获取锁释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题
-负面影响就是出现锁定资源争用的概率也会最高,致使并发度大打折扣
- 页级锁定(page-level)
- 锁定颗粒度介于行级锁定表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间
-页级锁定和行级锁定一样,会发生死锁
- 优化策略
- 缩短锁定时间
-尽两减少大的复杂Query,将复杂Query分拆成几个小的Query 分布进行
-尽可能的建立足够高效的索引,让数据检索更迅速
-尽量让MyISAM存储引擎的表只存放必要的信息,控制字段类型
-利用合适的机会优化MyISAM 表数据文件
-分离能并行的操作,MyISAM 存储引擎有一个控制是否打开Concurrent Insert功能的参数选项:
-concurrent_insert=2无论MyISAM 存储引擎的表数据文件的中间部分是否存在因为删除数据而留下的空闲空间,都允许在数据文件尾部进行Concurrent Insert
-concurrent_insert=1,当MyISAM 存储引擎表数据文件中间不存在空闲空间的时候,可以从文件尾部进行Concurrent Insert
-concurrent_insert=0无论MyISAM 存储引擎的表数据文件的中间部分是否存在因为删除数据而留下的空闲空间,都不允许Concurrent Insert
-合理利用读写优先级
- Innodb行锁优化建议
-尽可能让所有的数据检索都通过索引来完成,从而避免Innodb 因为无法通过索引键加锁升级为表级锁定
-合理设计索引,让Innodb 在索引键上面加锁的时候尽可能准确,尽可能的缩小锁定范围,避免造成不必要的锁定而影响其他Query 的执行
-尽可能减少基于范围的数据检索过滤条件,避免因为间隙锁带来的负面影响而锁定了不该锁定的记录
-尽量控制事务的大小减少锁定的资源量锁定时间长度
-在业务环境允许的情况下,尽量使用较低级别的事务隔离,以减少MySQL 因为实现事务隔离级别所带来的附加成本
- MySQL数据库Query优化思路和原则
-优化更需要优化的Query
-什么Query的优化能给系统整体带来更大的收益,就更需要优化
-一般来说,高并发低消耗(相对)的Query 对整个系统的影响远比低并发高消耗的Query 大
-定位优化对象的性能瓶颈
-首先要判断出这个Query 的瓶颈到底是IO还是CPU。到底是因为在数据访问消耗了太多的时间,还是在数据的运算(如分组排序等)方面花费了太多资源?
-自带的PROFILING功能很清楚的找出一个Query的瓶颈所在
-明确的优化目标
- 需要了解数据库目前的整体状态,该Query 在整个应用系统中所实现的功能。就能知道数据库所能承受的最大压力,也就清楚了我们能够接受的最悲观情况
-把握了该Query 相关数据库对象的信息,我们就应该知道实现该Query 的消耗最理想情况下需要消耗多少资源,最糟糕又需要消耗多少资源
-从Explain 入手
-只有Explain 才能告诉你,这个Query 在数据库中是以一个什么样执行计划来实现的
-在优化任何一个SQL 语句之前,应该先有一个预定的执行计划,通过不断的调整尝试,借助Explain 来验证调整的结果是否满足自己预定的执行计
-永远用小结果集驱动大的结果集
-只取出自己需要的Columns
-仅仅使用最有效的过滤条件
-尽可能避免复杂的Join和子查询
-充分利用 Explain 和 Profiling
- Explain使用
-EXPLAIN 命令来告诉我们他将使用一个什么样的执行计划来优化我们的Query
- Profiling使用
-Query Profiler 是一个使用非常方便的Query 诊断分析工具
-通过该工具可以获取一条Query 在整个执行过程中多种资源的消耗情况,如CPU,IO,IPC,SWAP 等,以及发生的PAGE FAULTS,CONTEXT SWITCHE
-同时还能得到该Query 执行过程中MySQL 所调用的各个函数在源文件中的位置
-开启profiling 参数:set profiling=1
- 索引
- 利处
- 极大的提高检索效率加快检索降低检索过程中所需要读取的数据量
- 索引还有一个非常重要的用途,那就是降低数据的排序成本
- 在进行排序分组操作中利用好索引,将会极大的降低CPU 资源的消耗
-弊端
- 最明显的资源消耗就是增加了更新所带来的IO量调整索引所致的计算量
-如何判定是否需要创建索引
- 较频繁作为查询条件的字段应该创建索引
- 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件(如状态字段,类型字段等)
- 更新非常频繁的字段不适合创建索引
- 不会出现在WHERE子句中的字段不该创建索引
- Join优化
-尽可能减少Join语句中的Nested Loop的循环总次数
-优先优化Nested Loop 的内层循环
-保证Join语句中被驱动表上Join条件字段已经被索引
-无法保证被驱动表的Join条件字段被索引且内存资源充足的前提下,不要太吝惜JoinBuffer的设置
-Sort优化
-加大max_length_for_sort_data 参数的设置
-去掉不必要的返回字段
-增大sort_buffer_size 参数设置
-Group By优化
-尽可能让MySQL 可以利用索引来完成GROUP BY 操作
-无法使用索引完成GROUP BY 的时候,必须要有足够的sort_buffer_size 来供MySQL 排序的时候使用,而且尽量不要进行大结果集的GROUPBY 操作
- MySQL数据库Schema设计优化
- 适度冗余 - 让Query尽量减少Join
- 大字段垂直分拆 - Summary表优化
- 大表水平分拆 - 基于类型的分拆优化
- 统计表 - 准实时优化
- MySQL Server(服务器本身)性能优化
- MySQL常用存储引擎优化
4,MySQL可扩展设计的基本原则
- 事务相关性最小化原则
- 数据一致性原则
- 高可用及数据安全原则
分享到:
评论

相关推荐

    mysql深度学习者 MySQL性能优化总结

    MySQL 性能优化总结 MySQL 性能优化是数据库管理和开发人员需要掌握的重要技能。性能优化的目标是让查询更快,减少查询所消耗的时间。为了达到这个目标,我们需要从每一个环节入手,包括连接、配置优化、索引优化、...

    mysql性能的优化

    ### MySQL性能优化详解 #### 一、什么是MySQL优化? MySQL优化是指通过合理安排资源和调整系统参数,使得MySQL运行得更快、更节省资源的过程。优化的目的在于减少系统瓶颈,降低资源消耗,提升系统的响应速度。 #...

    MySQL性能优化之参数配置.docx

    MySQL 性能优化之参数配置 MySQL 性能优化是一种重要的数据库优化技术,通过合理地配置 MySQL 参数,可以最大程度地提高 MySQL 的性能。本文将介绍如何通过修改 MySQL 参数来提高 MySQL 的性能。 修改 back_log ...

    MySQL性能优化和高可用架构实践.pptx

    "MySQL性能优化和高可用架构实践" 本书《MySQL性能优化和高可用架构实践》是一本详细介绍MySQL性能优化和高可用架构实践的书籍,旨在帮助读者提升MySQL数据库的性能和可靠性。本书的内容涵盖了查询优化的基本原则和...

    mysql数据库性能优化

    本文将围绕《构建高性能Web站点》一书中有关MySQL性能优化的部分内容进行详细解读,帮助读者更好地理解和掌握MySQL性能优化的方法和技术。 #### 二、友好的状态报告与正确使用索引 ##### 1. 友好的状态报告 - **...

    Mysql性能优化 MYSQL

    ### MySQL性能优化详解 #### 一、MySQL性能优化的重要性及背景 在当今互联网技术飞速发展的背景下,数据库作为数据存储的核心部分,其性能直接影响到整个系统的响应速度与用户体验。MySQL作为一款广泛使用的开源...

    mysql性能优化总结

    MySQL性能优化是一个涵盖广泛的主题,涉及数据库设计、SQL查询优化、索引策略等多个方面。以下是对标题和描述中提到的一些关键知识点的详细说明: 1. **表的优化**: - **定长与变长字段的分离**:将定长字段(如...

    mysql 性能优化与架构设计(word版)

    总结,MySQL性能优化与架构设计涵盖了许多方面,包括查询优化、索引策略、数据库设计、缓存利用、并行处理、架构设计、数据分布以及监控与调优工具的使用。理解和掌握这些知识点,能够帮助我们构建高效、稳定的...

    MySQL性能优化详解.docx

    ### MySQL性能优化详解 #### 一、MySQL性能优化的重要性及背景 在Web应用程序体系结构中,数据持久层(通常是关系数据库)是系统的核心部分之一,对整体系统的性能有着至关重要的影响。MySQL作为目前使用最广泛的...

    mysql性能优化教程.pdf (by caoz)

    ### MySQL性能优化知识点详解 #### 一、背景及目标 - **目的**:厦门游家公司(4399.com)为了提升员工技能水平,制定了这份MySQL性能优化教程,旨在为已有一定MySQL使用经验的工程师提供实战指导。 - **适用场景*...

    Mysql_如何进行性能优化教程

    MySQL性能优化是一个综合性的过程,需要从多个角度出发,包括执行优化、运维优化以及架构优化等方面进行全面考虑。通过合理地利用索引、调整内存配置、选择合适的存储引擎以及采用分布式架构等手段,可以显著提高...

    MySQL性能优化总结.pdf

    MySQL性能优化总结.pdf

    【No206】最新精选蚂蚁-MySQL语句性能优化视频教程下载

    MySQL性能优化是一个涉及多个方面的综合过程,包括但不限于SQL语句优化、索引管理、存储引擎选择等。通过合理的设计和持续的监控调优,可以显著提升数据库的性能,从而提高整个应用系统的响应速度和用户体验。对于...

    MySQL性能优化 SQL优化方法技巧

    ### MySQL性能优化与SQL优化方法技巧 #### 一、引言 MySQL作为一款广泛使用的开源关系型数据库管理系统,其性能优化对于确保应用系统的稳定性和高效运行至关重要。通过对MySQL的优化,不仅能提升系统的响应速度,还...

    MySQL性能优化.xmind

    mysql性能优化的总结,从各个方面对sql的优化进行了总结,感觉是很好的性能优化的摘要总结,所以上传共享出来,绝对的硬货。绿色版,解压直接用,方便程序猿

    高并发基础之-MySql性能优化.pdf

    总结来说,MySQL性能优化是一个系统工程,涵盖查询优化、数据库结构优化和服务器配置优化等多个层面。通过掌握这些优化手段,我们可以有效减少系统瓶颈,提高数据库响应速度,从而提升整个应用的性能。在实际操作中...

    mysql性能优化-慢查询分析、优化索引和配置.doc

    MySQL性能优化是一个重要的主题,尤其是对于处理大量数据的系统来说,高效的数据库操作直接影响到应用程序的响应速度和用户体验。本文将详细探讨慢查询分析、优化索引以及MySQL的配置优化。 一、优化概述 MySQL性能...

    Mysql性能优化教程.doc

    ### MySQL性能优化教程知识点概述 #### 一、MySQL执行优化 **1.1 背景及目标** - **背景**: 针对已具备一定MySQL使用经验的工程师,特别是适用于高并发、海量数据处理的互联网环境。 - **目标**: 通过对MySQL性能...

    MySQL架构执行与SQL性能优化 MySQL高并发详解 MySQL数据库优化训练营四期课程

    课程内容进行了精华的浓缩,有四大内容主旨,MySQL架构与执行流程,MySQL索引原理详解,MySQL事务原理与事务并发,MySQL性能优化总结与MySQL配置优化。课程安排的学习的教程与对应的学习课件,详细的学习笔以及课程...

Global site tag (gtag.js) - Google Analytics