在需要支持手机/平板应用和普通桌面浏览器的时代,一个网站的流行度和有效性在很大程度上取决于它的可用性和性能。缓慢的网站可能会导致访问者或潜在客户流失,并导致业务失败。访问速度相对较快的网站将决定访问者是否会使用该网站提供的产品或服务。拥有海量数据库的网站总是需要适当的关注、配置、优化、调整和维护,以确保网站的快速加载。本文将讨论如何对海量数据的MySQL数据库进行优化。选择InnoDB作为存储引擎。大型产品数据库对可靠性和并发性有很高的要求。作为默认的MySQL存储引擎,InnoDB是比MyISAM更好的选择。优化数据库结构组织数据库的架构、表和字段以减少I/O开销,将相关项放在一起,并提前计划以便在数据量增长时保持高性能。数据表的设计要尽量减少它占用的空间,表的主键要尽可能短。对于InnoDB表,主键所在的列在每个二级索引条目中被复制,因此如果二级索引很多,短的主键可以节省大量空间。仅创建提高查询性能所需的索引。索引有助于检索,但会增加插入和更新操作的执行时间。InnoDB的ChangeBuffering特性InnoDB提供了一个changebufferingconfiguration,可以减少维护辅助索引所需的磁盘I/O。大型数据库可能会经历大量表操作和大量I/O,以确保辅助索引保持最新。当相关页不在缓冲池中时,InnoDB的changebuffer会将更改缓存到辅助索引项中,从而避免没有立即从磁盘读取页而导致的耗时I/O操作。当页面加载到缓冲池中时,缓冲的更改被合并,然后更新的页面被刷新到磁盘。这样做可以提高性能并适用于MySQL5.5及更高版本。InnoDB页面压缩InnoDB支持表的页面级压缩。当写入数据页时,它会通过特定的压缩算法进行压缩。压缩数据写入磁盘,其打孔机制释放页面末尾的空块。如果压缩失败,数据将按原样写入。表和索引都被压缩,因为索引通常占数据库总大小的很大一部分,压缩可以显着节省内存、I/O或处理时间,从而达到提高性能和可伸缩性的目的。它还减少了内存和磁盘之间传输的数据量。MySQL5.1及更高版本支持此功能。请注意,页面压缩不支持共享表空间中的表。共享表空间包括系统表空间、临时表空间和通用表空间。使用主键上的排序数据源导入批量数据可加快数据插入过程。否则,可能需要在其他行之间插入行以保持顺序,这会导致高磁盘I/O,进而影响性能并增加页面拆分。关闭自动提交模式也是有益的,因为它会为每次插入将执行日志刷新到磁盘。在批量插入期间临时转移唯一键和外键检查也可以显着减少磁盘I/O。对于新创建的表,最佳做法是在批量导入后创建外键/唯一键约束。SQL语句优化为了提高查询速度,可以在WHERE子句中使用的列上添加索引。另外,不要对太多或太长的列使用主键索引,因为这些列值会增加读取所需的I/O资源,并在复制二级索引时占用缓存。如果索引包含不需要的数据,通过I/O读取这些数据并缓存它会降低服务器的性能和可扩展性。也不要对不必要的列使用唯一键索引,因为它会禁用更改缓冲。应该改用常规索引。减少和隔离耗时的函数调用。尽量减少查询中的全表扫描次数。调整缓存区域的大小和属性,例如InnoDB缓冲池、MySQL查询缓存等。这将通过从内存而不是磁盘获取数据来加快重复查询的速度。优化存储结构对于大型表,或者包含大量重复文本或数字数据的表,您应该考虑使用COMPRESSED(压缩)行格式。这需要更少的I/O来将数据放入缓冲池或执行全表扫描。一旦您的数据达到稳定大小,或者不断增长的表增加了数十或数百兆字节,您应该考虑使用OPTIMIZETABLE语句来重组表并压缩浪费的空间。重组表的全表扫描将需要更少的I/O。优化InnoDB磁盘I/O增加InnoDB缓冲池大小允许从缓冲池而不是通过磁盘I/O访问查询。通过调整系统变量innodb_flush_method,将清除缓冲区的索引调整到最大级别。使用其他存储设备配置RAID。MySQL的内存分配在为MySQL分配足够的内存之前,请考虑不同域对MySQL的内存需求。需要考虑的关键领域是:并发连接-对于大量并发连接,排序和临时表将需要大量内存。在撰写本文时,16GB到32GB的RAM足以处理3000多个并发连接的数据库。内存碎片会消耗大约10%或更多的内存。innodb_buffer_pool_size、key_buffer_size、query_cache_size等缓存和缓冲区消耗了大约80%的已分配内存。日常维护定期检查慢查询日志,优化查询机制,有效利用缓存减少磁盘I/O。优化它们以扫描最少的行数而不是进行全表扫描。其他可以帮助DBA检查和分析性能的日志包括:错误日志、一般查询日志、二进制日志、DDL日志(元数据日志)。定期刷新缓存和缓冲区以减少碎片。使用OPTIMIZETABLE语句重新组织表并压缩可能浪费的任何空间。
