优化问题主要从SQL优化、事务级别调整、MySql配置参数调整做起
首先了解下事务的隔离级别,数据库共定义了四种隔离级别:
可以通过 set transaction isolation level 设置事务隔离级别来提高性能
#基础配置
datadir=/data/datafile
socket=/var/lib/mysql/mysql.sock
log-error=/data/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character_set_server=utf8#允许任意IP访问
bind-address = 0.0.0.0#是否支持符号链接,即数据库或表可以存储在my.cnf中指定datadir之外的分区或目录,为0不开启#symbolic-links=0#支持大小写
lower_case_table_names=1#二进制配置
server-id = 1
log-bin = /data/log/mysql-bin.log
log-bin-index =/data/log/binlog.index
log_bin_trust_function_creators=1
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION#InnoDB存储数据字典、内部数据结构的缓冲池,16MB已经足够大了。
innodb_additional_mem_pool_size = 16M#InnoDB用于缓存数据、索引、锁、插入缓冲、数据字典等#如果是专用的DB服务器,且以InnoDB引擎为主的场景,通常可设置物理内存的60%#如果是非专用DB服务器,可以先尝试设置成内存的1/4
innodb_buffer_pool_size = 4G#InnoDB的log buffer,通常设置为 64MB 就足够了
innodb_log_buffer_size = 64M#InnoDB redo log大小,通常设置256MB 就足够了
innodb_log_file_size = 256M#InnoDB redo log文件组,通常设置为 2 就足够了
innodb_log_files_in_group = 2
innodb_file_per_table = 1#InnoDB共享表空间初始化大小,默认是 10MB,改成 1GB,并且自动扩展
innodb_data_file_path = ibdata1:1G:autoextend#设置临时表空间最大4G
innodb_temp_data_file_path=ibtmp1:500M:autoextend:max:4096M#启用InnoDB的status file,便于管理员查看以及监控
innodb_status_file = 1#当设置为0,该模式速度最快,但不太安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。#当设置为1,该模式是最安全的,但也是最慢的一种方式。在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。#当设置为2,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。
innodb_flush_log_at_trx_commit = 1
max_connections=600
max_connect_errors=1000
max_user_connections=400#设置临时表最大值,这是每次连接都会分配,不宜设置过大 max_heap_table_size 和 tmp_table_size 要设置一样大
max_heap_table_size = 100M
tmp_table_size = 100M#每个连接都会分配的一些排序、连接等缓冲,一般设置为 2MB 就足够了
sort_buffer_size = 2M
join_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 2M#建议关闭query cache,有些时候对性能反而是一种损害
query_cache_size = 0
key_buffer_size = 8M
long_query_time = 120
slow_query_log=1 #开启mysql慢sql的日志
log_output=table,File #日志输出会写表,也会写日志文件,为了便于程序去统计,所以最好写表
slow_query_log_file=/data/log/slow.log
innodb_buffer_pool_dump_at_shutdown=1
innodb_buffer_pool_load_at_startup=1#打印deadlock日志
innodb_print_all_deadlocks=1
数据表分区主要是解决监控数据过大造成的单表数据量过大,在存储及查询的过程中对性能造成影响,通过数据表分区,减小数据文件的大小,提高磁盘读写性能。
分区设计:
数据库优化中,除了Sql本身之外,数据库本身的优化也是很重要的一个环节,缓存就是其中一项。
查看查询缓存情况:
mysql> show variables like '%query_cache%'; (query_cache_type 为 ON 表示已经开启)
+------------------------------+----------+| Variable_name | Value |
+------------------------------+----------+
| have_query_cache | YES || query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 || query_cache_size | 20971520 |
| query_cache_type | ON || query_cache_wlock_invalidate | OFF |
+------------------------------+----------+
如果不是ON,修改/etc/my.cnf配置文件以开启查询缓存:
[mysqld]中添加:
query_cache_size = 20M
query_cache_type = ON
重启mysql服务使配置查询缓存配置生效:
> service mysql restart
可以的,MySql8.x支持动态修改配置参数
1、可以的,通过 set global 命令直接修改,不用重启mysql
2、要是8.x 可以用 set persist 新特性
示例:
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。