--- layout: post title: mysql性能优化 category: 技术 tags: Mysql keywords: description: 翻译自Mysql5.7的英文参考手册第8章 --- Mysql性能优化涉及到配置、调整和测试性能等多个层面。根据你的工作角色(开发、DBA或者兼具两者),你可能在个别sql语句、整个应用级别、单个数据库或者多个网络数据库等不同级别优化。有时可能是有计划的主动提升性能。更多时候可能是在问题发生后,分析配置或者代码问题。优化CPU和内存的使用可以提高扩暂性,可以使得数据库处理更多的负载而不变慢。 ## 1 概述 数据库调优在数据库级别依赖几个因素:表、查询和设置的配置。这些软件对硬件层面的CPU和IO操作造成影响,你必须尽可能降低该影响。 如果工作是数据库调优,应该从学习软件侧的高级别的规则和指导开始,并使用wall-clock时间测试性能。当你成为一个专家时,了解了更多的内部原理,可以测试像CPU周期、IO操作等工作了。 典型用户的目标是从他们已有的软件和硬件配置上获取最好的数据库性能。更高级的用户寻找机会提高Mysql软件自身,或者开发他们自己的存储引擎和硬件来扩展MySql的生态。 ## 2 数据库调优的几方面 ### 2.1 数据库层面调优 DB级别调优的影响因素 - 表结构是否正确? - 需要查询性能的地方是否有正确的索引? - 每张表是否使用了适合的存储引擎,并且使用了每个存储引擎的强项和特性? - 每张表是否使用了合适的行格式? - 应用是否使用了合适的锁策略? - 所有的内存区域是否用于缓存? **注意:** 在Mysql5.5+中,InNoDB是每个新表的默认存储引擎。在实践中,先进的InnoDB性能特征意味着InnoDB表往往优于更简单的MyISAM表,特别是对于繁忙的数据库。 ### 2.2 硬件层面优化 在数据库越来越忙时,任何数据库应用最终都受限于硬件。DBA必须评估是否需要调整应用或者重新配置服务来避免系统瓶颈。或者是否需要更多的硬件资源。 系统瓶颈典型的来源于以下几种资源: - 磁盘寻道 - 磁盘IO - CPU周期 - 内存带宽 ## 2.3 平衡便捷性和性能 为了在便捷的Mysql程序中使用面向性能的Sql扩展,可以在“/*! */”注释分隔符包装Mysql的特定关键字。 ## 手段/方法 ### 查询表空洞 表空洞:是指删除数据时,mysql 不会物理删除,而是会将数据和索引标记为删除。而会让清除线程来清除索引而导致数据失效但是仍然占用空间未释放给操作系统的现象。 `SELECT DATA_LENGTH,DATA_FREE from information_schema.tables where table_schema='hotel_report' and table_name='deep_poi_bd_room_night'` 可通过`optimize table`命令优化,但是InnoDB类型的表是无法使用`optimize table`命令