随着数据和负载增加,MySQL数据库会日渐缓慢,性能越来越差,用户体验也随之变差,所以数据库性能优化十分紧迫,云吞铺子分享MySQL数据库优化大全:
MySQL数据库优化
云吞铺子先模拟一下数据库访问流程,然后逐步的优化这些环节,可以从减少数据访问(减少磁盘访问)、返回更少数据(减少网络传输或磁盘访问)、减少交互次数(减少网络传输)、减少服务器CPU开销(减少CPU及内存开销)和利用更多资源(增加资源)几个方面来提升数据库性能。
可以从以下及方面优化MySQL数据库:
一:数据库结构优化
- 1)范式优化:表的设计合理化(符合3NF),比如消除冗余(节省空间);
- 2)反范式优化:比如适当加冗余等(减少join)
- 3)拆分表:分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行全表扫描,明显缩短了查询时间,另外处于不同磁盘的分区也将对这个表的数据传输分散在不同的磁盘I/O,一个精心设置的分区可以将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时时表可采取此方法,可按月自动建表分区。
二:优化SQL语句
- 1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描;
- 2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
- 3)很多时候用exists代替in是一个好的选择;
- 4)用Where子句替换HAVING子句,因为HAVING只会在检索出所有记录之后才对结果集进行过滤;
- 5)迅速的定位执行速度慢的语句、开启慢查询、设置慢查询时间、启用慢查询日志、通过mysqldumoslow工具对慢日志进行分类汇总;
- 6)析SQL语句,通过explain分析查询、通profiling可以得到更详细的信息;
- 7)创建索引(主键索引/唯一索引/全文索引/普通索引);
- 8)避免Select * (不查询多余的列与行);
- 9)使用视图(经常被查询的列数据,并且这些数据不被经常的修改,删除);
三:分表技术(水平分割、垂直分割)、分区技术
如果遇到大表的情况下,SQL语句优化已经无法继续优化了,我们可以考虑分表和分区,目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。
分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。
- 1)都能提高mysql的性能,在高并发状态下都有一个良好的表现;
- 2)分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式,访问量不大,但是表数据很多的表,我们可以采取分区的方式等;
- 3)分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系;
- 4)表分区相对于分表,操作方便,不需要创建子表。
四:读写分离
MySQL读写分离可以参考:阿里云MySQL读写分离详解,本文来说说抛开阿里云来实现读写分离的方法:
- 方法一:php程序上自己做逻辑判断,写php代码的时候,自己在程序上做逻辑判读写匹配。select,insert、update、delete做正则匹配,根据结果选择写服务器(主服务器)。如果是select操作则选择读服务器(从服务器器) mysql_connect('读写的区分')
- 方法二:MySQL中间件,基本的原理是让主数据库处理写操作(insert、update、delete),而从数据库处理查询操作(select)。而数据库的一致性则通过主从复制来实现。所以说主从复制是读写分离的基础。
五:存储过程 [模块化编程,可以提高速度]
存储过程是SQL语句和控制语句的预编译集合,保存在数据库中,可有应用程序调用执行,而且允许用户声明变量、逻辑控制语句及其他强大的编程功能。包含逻辑控制语句和数据操作语句,可以接收参数、输出参数、返回单个或多个结果值及返回值。
使用存储过程的优点:模块化程序设计,只需创建一次,以后即可调用该存储过程任意次;执行速度快,效率高;减少网络流量;具有良好的安全性。
六:对mysql配置优化 [配置最大并发数, 调整缓存大小]
MySQL数据库优化大全方法汇总
七:MySQL服务器硬件升级
MySQL服务器硬件升级云吞铺子就不多赘述了,也可以使用云数据库,参考:阿里云MySQL云服务器详解
八:定时的去清除不需要的数据,定时进行碎片整理
- 1)查看表碎片的方法
select ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH,MAX_DATA_LENGTH,DATA_FREE,ENGINE from TABLES where TABLE_SCHEMA='test_db' and TABLE_NAME='table_name' limit 1;
- 2)Innodb存储引擎清理碎片方法:
ALTER TABLE tablename ENGINE=InnoDB
- 3)Myisam存储引擎清理碎片方法:
OPTIMIZE TABLE table_name
注意:MySQL碎片整理尽量选择业务不繁忙时清理,一个月清理一次即可。