ITPub博客

首页 > 数据库 > MySQL > Mysql系统优化

Mysql系统优化

原创 MySQL 作者:wzgchen 时间:2015-07-15 15:25:46 0 删除 编辑


在MySQL中避免使用Swappiness,避免当系统用完物理内存后将信息写入磁盘而不是释放一些内存;


grep 'vm.swappiness = 0' >> /etc/sysctl.conf
sysctl -w vm.swappiness=0
为 MySQL 选择正确的文件系统


最好的文件系统是XFS、ext4 和 Btrfs。它们都是可以使用超大文件和大容量存储卷的企业级日志型文件系统。
关于这三个文件系统的有用信息:
文件系统                XFS        Ext4        Btrfs
文件系统最大容量        8EB        1EB            16EB
最大文件大小            8EB        16TB        16EB
MySQL配置优化


skip-name-resolve


禁用 MySQL 的 DNS 反向查询
wait_timeout = 120


空闲连接(即处于“sleep”状态并且保持了很长一段时间的连接)会消耗资源,可以使用以下命令查看:


mysqladmin processlist -u root -p | grep “Sleep”


可以的话应该被终止或者刷新
max_allowed_packet = 128M


设置 MySQL 允许的最大数据包,设置得过低可能会导致查询速度变得非常慢,然后在 MySQL 的错误日志看到一个错误。建议将该值设置为最大包的大小。
tmp_table_size = 1024M


max_heap_table_size = 1024M


配置临时表容量和内存表最大容量,避免磁盘写入,会影响数据库的性能 通常按 64M/G 配置
max_connections = 300


MySQL 的最大连接数,可动态调整;连接太多会导致内存的使用量过高并且会锁住你的MySQL服务器


set global max_connections = 300;
thread_cache_size = 128M


设置服务器缓存的线程数量;


show status like 'Threads_created';
show status like 'Connections';


100 - ((Threads_created / Connections) * 100)


set global thread_cache_size = 128;
innodb_use_sys_malloc = 1;


默认值:1;
安装libunwind(32位操作系统忽略)
wget http://download.savannah.gnu.org/releases/libunwind/    libunwind-1.0.tar.gz
tar xvf libunwind-1.0.tar.gz -C /usr/local/src/
cd /usr/local/src/libunwind-1.0
CFLAGS=-fPIC ./configure --enable-shared
make CFLAGS=-fPIC
make CFLAGS=fPIC install
innodb_file_per_table = 1


MySQL5.6及以上的版本默认启用
每张表一个数据文件,可以大大提升磁盘的 I/O 负载;
当删除或截断一个数据库表时,也可以回收未使用的空间。
innodb_buffer_pool_size = 1024M


默认值: 128M;
Innodb引擎最主要的优化项;指定 InnoDB 使用多少内存来加载数据和索引(data+indexes);
1. 通过查看各种引擎表和索引大小,根据实际大小配置:  
        SELECT ENGINE,  
            ROUND(SUM(data_length + index_length)/1024/1024, 1) AS "ToTal MB"  
        FROM   
            INFORMATION_SCHEMA.TABLES  
        WHERE   
            table_schema NOT IN ("infomation_schema", "performance_schema")  
        GROUP BY ENGINE;  
2. 独立的MySQL数据库服务器可设置为服务器内存的50%-80%,可通过以下命令自动配置`(注意修改配置文件路径,修改后需重启mysqld服务)`;
        sed -i "s#innodb_buffer_pool_size.*#innodb_buffer_pool_size = "$(echo "scale=0;$(free|grep Mem|awk '{print $4}')/1024/100*80"|bc)"M#g" /etc/my.cnf;  
        service mysqld restart
3. 也可以查看innodb引擎的状态作为参考:
        mysql> show innodb engine status;


    * 该值设置得更大可能会存在风险,比如没有足够的空闲内存留给操作系统和依赖文件系统缓存的某些MySQL子系统(subsystem),包括二进制日志(binary logs),InnoDB事务日志(transaction logs)等;  
innodb_buffer_pool_instances = 1


默认值:1;innodb缓冲池个数;
innodb_buffer_pool_size   配置需大于1G才生效;最多支持64个innodb_buffer_pool实例;
innodb_max_dirty_pages_pct = 75


innodb_adaptive_flushing


默认开启,可动态更新;自适应刷新脏页功能;
以下3中情况会吧 innodb_buffer_pool 的脏页刷入磁盘
1. 脏页超过 innodb_max_dirty_pages_pct 设置
2. 日志ib_logfile文件写满以后
3. 磁盘空闲时
innodb_old_block_pct = 37


默认值:37;控制进入缓冲区域的数量;
扫描大表或mysqldump时可以设置较小如5,避免较多的热数据被踢出;
访问小表或查询结果少,可以保持默认或设置较大;
查看状态:mysql> show engine innodb status\G;  (留意 Old database Page, young page字眼) 
innodb_thread_concurrency = 0


默认值:0;有利于发挥CPU多核处理能力,提高并发量;
innodb_read_io_threads = 8


innodb_write_io_threads = 8


默认值:4;可充分利用多核CPU处理能力;
innodb读写线程数;(个人理解为二者之和为CPU核数,可根据读写调整,比如读多写少可调整为:10,6)
状态查看命令:mysql> show engine innodb status\G;
innodb_io_capacity = 2000


默认值:200;动态调整刷新脏页的数量,单位页;取决与磁盘IOPS(每秒读写次数);
可使用SUPER权限动态调整,如:mysql> set global innodb_io_capacity = 2000;  
innodb_io_capacity  磁盘配置
200                 单盘SAS/SATA
2000                SAS * 12 RAID10
5000                SSD
50000               FUSION-IO
innodb_read_ahead_threshold = 65


默认值:65; 线性预读提高IO性能;
innodb_user_native_aio


默认开启;实现异步IO;
依赖:yum -y install libaio
查看是否工作:# cat /proc/slabinfo | grep kio # kio 不为0表示异步IO已工作
log_slow_admin_statements = 1


log_slow_slave_statements = 1


long_query_time = 1


slow_launch_time = 1


slow_query_log = 1


slow_query_log_file = /var/log/mysql/slow.log


官方InnoDB参数


innodb_purge_threads = 1
innodb_file_format = barracuda
innodb_buffer_pool-size = 8192M
innodb_support_xa = FALSE
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2
innodb_log_file_size = 2000M
innodb_log_buffer_size = 64M
innodb_io_capacity = 200
skip-innodb-adaptive-hash-index
innodb-read-io-threads = 8
innodb-write-io-threads = 8
innodb_change_buffering = all
innodb_stats_on_metadata = off
innodb-buffer-pool-instances = 12
max_tmp_tables = 100
query_cache_size = 0
query_cache_type = 0
max_connections = 1000
max_prepared_stmt_count = 1048576
sort_buffer_size = 32768
数据库结构优化,SQL优化


优化索引


冗余索引检查工具


pt-duplicate-key-checker
逻辑及程序优化


性能测试工具


测试 MySQL 的性能优化测试工具: mysqltuner


wget https://github.com/major/MySQLTuner-perl/tarball/master
tar xf master
cd major-MySQLTuner-perl-993bc18/
./mysqltuner.pl
优化和修复 MySQL 数据库


mysqlcheck -u root -p --auto-repair --check --optimize --all-databases


mysqlcheck -u root -p --auto-repair --check --optimize databasename


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/91975/viewspace-1734115/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: Mysql关于OS级优化
请登录后发表评论 登录
全部评论

注册时间:2015-05-01

  • 博文量
    383
  • 访问量
    213567