一、数据库调优的措施:
1.调优的目标:
(1)尽可能节省系统资源,以便系统可以提供更大负荷的服务
(2)合理的结构设计和参数调整,以提高用户操作的响应速度
(3)减少系统的瓶颈,提高MySQL数据库整体的性能;
2.如何定位调优:用户的反馈、日志分析、服务器资源使用监控、数据库内部状况监控
3.调优的维度和步骤:
(1)选择合适的DBMS:DBMS的选择关系到了后面的整个设计过程,所以第一步就是要选择适合的DBMS
(2)优化表设计:表的结构要尽量遵循三范式原则,如果查询的次数比较多可以采用反范式化进行优化,表字段的数据类型应该合理。
(3)优化逻辑查询:子查询优化、等价谓词重写、视图重写、条件优化、连接消除和嵌套连接消除等
(4)优化物理查询:合理使用表的索引
(5)使用Redis或者Memcached作为缓存
(6)库级优化:
a.读写分离:
b.数据分片:
二、优化MySQL服务器:
1.优化服务器硬件:服务器的硬件性能直接决定着MySQL数据库的性能,硬件的性能瓶颈直接决定MySQL数据库的运行速度和效率,针对性能瓶颈提高硬件配置,可以提高数据库的查询和更新速度。
(1)配置较大的内存:足够大的内存是提高MySQL数据库的性能方法之一,内存的速度比磁盘IO快很多,可以通过增加系统的缓冲区容量使得数据在内存中停留的时间更长,以减少磁盘的IO。
(2)配置高速磁盘系统
(3)合理分布磁盘IO:把磁盘IO分散在多个设备上,以减少资源竞争,提高并行操作能力
(4)配置多处理器:MySQL是多线程的数据库,多处理器可以同时执行多个线程。
2.优化MySQL的参数:通过优化MySQL的参数可以提高资源利用率,从而达到提高服务器性能的目的。主要的参数都在my.cnf或者my.ini文件的[mysqld]组中,配置完毕参数后需要重新启动MySQL服务才能生效。
(1)innodb_buffer_pool_size:表示InnoDB类型的表和索引的最大缓存。它不仅仅缓存索引数据,还会缓存表的数据。这个值越大,查询的速度就会越快。但是这个值太大会影响操作系统的性能。
(2)key_buffer_size:表示索引缓冲区的大小,索引缓冲区是所有的线程共亭。增加索引缓冲区可以得到更好处理的索引(对所有读和多重写)。key_buffer_size的大小取决于内存的大小。如果key_buffer_size太大,就会导致操作系统繁换页,也会降低系统性能。
(3)table_cache:表示同时打开表的个数,table_cache值越大,能够同时打开的表的个数越多。物理内存越大,但是该值越大会影响操作系统的性能。
(4)query_cache_size:表示查询缓冲区的大小。如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,就要增加Query_cache_size的值;如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓存;MySQL8.0之后失效。该参数需要和query_cache_type配合使用。
(5)query_cache_type:当query_cache_type的值是0时,所有的查询都不使用查询缓存区。当该参数的值为1时,所有的查询都将使用查询缓存区,当该参数的值为2时,只有在查询语句中使用SQL_CACHE关键字查询才使用查询缓存区。使用查询缓存区可以提高查询的速度,这种方式只适用于修改操作少且经常执行相同的查询操作的情况。
(6)sort_buffer_size:表示每个需要进行排序的线程分配的缓冲区的大小。增加这个参数的值可以提高ORDER BY或GROUP BY操作的速度。
(7)join_buffer_size:表示联合査询操作所能使用的缓冲区大小,和sort_buffer_size一样该参数对应的分配内存也是每个连接独享。
(8)read_buffer_size:表示每个线程连续扫描时为扫描的每个表分配的缓冲区的大小(字节)。当线程从表中连续读取记录时需要用到这个缓冲区。
(9)innodb_flush_log_at_trx_commit:表示何时将缓冲区的数据写入日志文件,并且将日志文件写入磁盘中。该参数对于InnoDB引擎非常重要。该参数有3个值,分别为0、1和2,默认值为1。
a.innodb_flush_log_at_trx_commit的值为0:表示每秒1次的频率将数据写入日志文件并将日志文件写入磁盘。每个事务的commit并不会触发前面的任何操作。该模式速度最快,但不太安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。
b.innodb_flush_log_at_trx_commit值为1:表示每次提交事务时将数据写入日志文件并将日志文件写入磁盘进行同步。该模式是最安全的,但也是最慢的一种方式。因为每次事务提交或事务外的指令都需要把日志写入(flush)硬盘。
c.innodb_flush_log_at_trx_commit值为2:表示每次提交事务时将数据写入日志文件,每隔1秒将日志文件写入磁盘。该模式速度较快。也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。
(10)innodb_log_buffer_size:是InnoDB存储引擎的事务日志所使用的缓冲区的大小。为了提高性能也是先将信息写入Innodb Log Buffer中,当满足innodb_flush_log_tnx_commit参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件(或者同步到磁盘)中。
(12)max_connections:表示允许连接到MySQL数据库的最大数量,默认值是151,连接数 不是越大越好,因为这些连接会浪费内存的资源。过多的连接可能会导致MySQL服务器僵死。
(13)back_log:用于控制MySQL监听TCP牆口时设置的积压请求栈大小,如果MySql的连接数达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log将不被授予连接资源。
(14)thread_cache_size:线程池缓存线程数量的大小,当客户端断开连接后将当前线程缓存起来,当在接到新的连接请求时快速响应无需创建新的线程。
(15)wait_timeout:指定一个请求的最大连接时间
(16)interactive_timeout:表示服务器在关闭连接前等待行动的秒数