超详细的MySQL数据库优化
1.优化概述
优化
作者将优化分为两类,软优化和硬优化。软优化一般是操作数据库,硬优化是操作服务器硬件和参数设置。
2.1软优化
2.1.1查询语句优化
1.首先,我们可以使用解释或描述(DESC)命令来分析查询语句的执行信息。
2.示例:
显示:
它将显示索引和查询数据读取的数据数量等信息。
2.1.2优化子查询
在MySQL中,尽量用JOIN代替子查询。因为子查询需要嵌套查询,所以嵌套查询时会创建一个临时表,临时表的建立和删除会有较大的系统开销,而join查询不会创建临时表,所以比嵌套子查询效率高。
2.1.3使用索引
索引是提高数据库查询速度的重要方法之一。关于index,请参考作者;本文的介绍比较详细,这里记录了使用索引的三个注意事项:
2.1.4分解表
对于一个字段较多的表,如果有些字段使用频率较低,就应该将其分离出来,形成一个新表。
2.1.5中间表
可以为将查询大量连接的表创建中间表,从而减少查询期间耗时的连接。
2.1.6添加冗余字段
与创建中间表类似,添加冗余也是为了减少连接查询。
2.1.7分析表、检查表和优化表
分析表主要分析表中关键字的分布,检查表主要检查表中是否有错误,优化表主要消除删除或更新造成的表空间浪费。
1.分析表:使用分析关键字,如分析表用户;
2.检查表:使用检查关键字,如检查表用户[选项]。
选项仅对MyISAM有效,* * *五个参数值:
3.优化表:使用优化关键字,如优化[local | no _ write _ to _ binlog]table user;
LOCAL|NO_WRITE_TO_BINLOG表示不写入日志。优化的表仅对VARCHAR、BLOB和TEXT有效。可以通过OPTIMIZE TABLE语句消除文件碎片,并在执行过程中添加一个只读锁。
2.2硬优化
2.2.1五金三件套
1.配置多核和高频cpu。多核可以执行多个线程。
2.配置大内存,提高内存,可以增加缓存区的容量,从而减少磁盘I/O时间,提高响应速度。
3.配置高速磁盘或者合理分布磁盘:高速磁盘提高I/O,分布磁盘可以提高并行运行的能力。
2.2.2优化数据库参数
优化数据库参数可以提高资源的利用率,从而提高MySQL服务器的性能。MySQL服务的配置参数都在my.cnf或者my.ini里面以下是几个对性能影响比较大的参数。
2.2.3子库与子表
因为数据库压力过大,第一个问题就是高峰期可能会降低系统性能,因为数据库负载高会影响性能。另外一个,压力太大挂了你的数据库怎么办?所以这个时候你要把系统分成库和表+读写分离,也就是把一个库拆分成多个库部署在多个数据库服务上,然后作为主库承载写请求。然后每个主库挂载至少一个从库,从库携带读取请求。
高速缓存集群
如果用户数量在增加,这个时候可以继续加机器。例如,如果您一直在系统级添加机器,您可以承载更高的并发请求。然后,如果数据库级的写并发越来越高,那么就要对数据库服务器进行扩展,通过把数据库分成表来支持扩展机。如果数据库级别的读取并发越来越高,那么扩展将添加更多的从数据库。但是这里有一个很大的问题:数据库本身并不是用来承载高并发请求的,所以一般来说,单个数据库每秒承载的并发量都在千的量级,而且数据库使用的机器都是比较高配置的,比较贵的机器,成本非常高。如果只是单纯的不停的加机器,其实是不对的。所以高并发架构中通常会有一个缓存环节,缓存系统是为了承载高并发而设计的。所以单机的并发是每秒几万甚至几十万,高并发的承载能力比数据库系统高一两个数量级。所以根据系统的业务特点,可以针对写的少读的多的请求引入缓存集群。具体来说,写数据库的时候,同时将数据的副本写入缓存集群,然后用缓存集群承载大部分的读请求。这样,通过缓存集群,可以用更少的机器资源承载更高的并发性。
一个完整复杂的高并发系统架构肯定会包括:各种复杂的自研基础架构系统。各种精美的建筑设计。所以,一篇小文章最多也就起到了引玉的作用,但是数据库优化的思路就快结束了。