MySQL服务器性能优化
和大多数数据库一样,MySQL提供了很多的参数来进行服务器的优化设置,数据库服务器第一次启动的时候,很多参数都是默认设置的,这在实际生产环境中并不能完全满足需求,为此数据库管理员要进行必要的设置。
======================================================================
【MySQL源码安装】
第一步:
下载mysql-505.24.tar.gz和cmake-2.8.4.tar.gz两个源文件
第二步:
安装MySQL源文件包是采用cmake安装的,首先安装cmake;
在cmake的安装目录下解压cmake:
[root@localhost Mysql5.5]# tar -zxv -f cmake-2.8.4.tar.gz
进入到cmake的加压目录中:
[root@localhost Mysql5.5]# cd cmak-2.8.4
运行./configure:
[root@localhost cmak-2.8.4]# ./configure
执行cmake的安装步骤:
[root@localhost Mysql5.5]# make
[root@localhost Mysql5.5]# make install
第三步:
创建MySQL安装程序的目录和数据文件的目录
[root@localhost ~]# mkdir -p /usr/local/mysql
[root@localhost ~]# mkdir -p /usr/local/mysql/data
第四步:
创建MySQL用户和MySQL用户组
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -r -g mysql mysql
第五步:
解压缩MySQL源代码,并使用cmake安装MySQL源代码
进入到mysql的压缩包所在的目录中;
[root@localhost Mysql5.5]# tar -zxv -f mysql-5.5.24.tar.gz
[root@localhost Mysql5.5]# cd mysql-5.5.24/
[root@localhost mysql-5.5.24]# cmake -DCMAKE_INSTALL_PREFIX=/user/local/mysql
-DMYSQL_DATADIR=/user/local/mysql/data
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DEXTRA_CHARSETS=all
-DENABLED_LOCAL_INFILE=1
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DWITH_EXAMPLE_STORAGE_ENGINE=1
-DWITH_FEDERATED_STORAGE_ENGINE=1
-DWITH_PRATITION_STORAGE_ENGINE=1
[root@localhost mysql-5.5.24]# make
[root@localhost mysql-5.5.24]# make install
第六步:
设置目录权限:
[root@localhost mysql-5.5.24]# cd /usr/local/mysql/
[root@localhost mysql]# chown -R root:mysql .
[root@localhost mysql]# chown -R mysql:mysql data
第七步:创建my.cnf文件,并且初始化数据库
[root@localhost mysql]# cp ./support-files/my-medium.cnf etc/my.cnf
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql
第八步:设置环境变量
[root@localhost mysql]# cd ~
[root@localhost ~]# .bash_profile
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin:/usr/local/mysql/lib
第九步:
启动MySQL
[root@localhost ~]# cd /usr/local/mysql/
[root@localhost mysql]# ./bin/mysqld_safe --user=mysql &
=====================================================================
【执行以下命令可以看到所有的编译选项】
[root@localhost cmake-2.8.4]# ./configure --help
======================================================================
【可以通过改变编译选项,提高数据库的性能】
(1)可以使用如下的命令来指定MySQL数据的源文件和数据文件存放的位置,改变安装前缀,将所有的安装的内容安装到/usr/local/mysql5.5
[root@localhost cmak-2.8.4]# ./configure --prefix=/usr/local/mysql5.5
(2)修改with-unix-socket-path选项来改变数据库sock文件位置
[root@localhost cmak-2.8.4]# ./configure --unix-socket-path=/usr/local/mysql/tmp/mysql.sock
(3)改变MySQL默认字符集和默认排序规则
[root@localhost cmak-2.8.4]# ./configure --with-charset=CHARSET
[root@localhost cmak-2.8.4]# ./configure --with-collation=COLLATION
(4)MySQL数据库源码安装可以采用静态编译以提高性能
[root@localhost cmak-2.8.4]# ./configure --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static
参数说明:
【静态方式编译客户端】--with-client-ldflags=-all-static
【静态方式编译服务端】--with-mysqld-ldflags=-all-static
在MySQL数据库系统中,有些参数直接影响到系统的整体性能。MySQL默认的参数设置往往不能达到实际应用的需求。这里是一些通用的方法,不涉及具体的存储引擎;
MySQL服务器启动之后
【SHOW VARIABLES】
查询服务器一些静态的参数,比如,缓冲区的大小、字符集、数据文件名称等信息;
【SHOW RARIABLES】
查看MySQL启动之前已经配置好的一些系统静态参数。
【SHOW STATUS】
查询服务器运行中的状态信息;
比如当前连接数、锁等状态信息;
【在操作系统下直接查询数据库的状态】
[root@localhost ~]# mysqladmin -uroot variables
【查看MySQL服务器某个参数的含义】
[root@localhost ~]# mysqld -verbose -help|more
【如果需要查询某些参数的含义,可以进行过滤查询】
[root@localhost ~]# mysqld -verbose -help|grep thread
该命令会把包含thread的命令的信息查询出来;
在MySQL数据库中,key_buffer_size参数是对MyISAM表性能影响最大的一个参数;
该参数用来设置索引块缓存的大小,只使用于MyISAM存储引擎,MySQL5.1之后,提供了多个key_buffer,可以将制定的表索引缓存到指定的key_buffer,这样可以更好的降低线程之间的竞争。
【查看key_buffer_size的大小】
mysql> show variables like “key_buffer_size”;
【修改key_buffer_size的大小】
mysql > set global key_buffer_size=204800;
【设置多个key_buffer】
先建立一个索引缓存:
mysql>set global hot_cache2.key_buffer_size=128*1024;
将相关表的索引放到指定的索引缓存中,
mysql > cache index t,t2 in hot_cache2;
想要把表t的索引加载到默认的缓存(key_buffer)中
mysql > load index into cache t;
如果想要删除索引缓存,则只需要设置该缓存区大小为0即可;
mysql > set global hot_cache2.key_buffer_size=0;
值得注意的是,不能删除默认的索引缓存区,删除是无效的;
说明:
Cache index命令可以将多个表的索引加载到指定的索引缓存区中,但是每次数据库重启之后,索引缓冲区中的数据会被清空,此时可以考虑在配置文件/etc/my.cnf中添加执行init-file选项,每次服务器启动的时候自动的将指定表的索引加载到缓冲区中;
init_file=/root/initSQL/mysqld_init.sql
数据库每次启动的时候执行/root/initSQL/mysqld_init.sql脚本文件,该文件可以将多个表索引加载到缓冲区中,例如下面将表t1和表t2的索引加载到hot_cache缓冲区中;
cache index t1,t2 in hot_cache;
table_cache参数和key_buffer_size参数一样只适用与MyISAM存储引擎,在mysqld中,对table_cache参数的定义:
table_cache参数表示数据库用户打开表的缓存数量,每个连接进来,都至少打开一个表缓存。因此该参数的值与max_connections有关;
当一个连接访问一个表的时候,如果该表已经在缓存中打开,则会直接访问缓存中的表信息,如果该表没有被缓存,则会将当前的表添加到缓存并进行查询。table_cache用于限制缓存表的最大数目,如果当前缓存没有达到了table_cache缓存表数量的上限,则会将表缓存起来;
如果达到了table_cache缓存表的数量的上限,MySQL将根据缓存表的最后查询时间、查询率等规则释放之前的缓存;
在设置该参数的时候,可以通过检查open_tables和opened_tables确定该参数的值,open_tables参数表示当前打开的表缓存数,opened_tables参数表示曾经打开的表缓存的数,如果执行FLUSH TABLE操作,则系统会关闭一些当前没有使用的表缓存,因此FLUSH TABLE操作之后,open_tables参数的值会变小,opened_tables参数的值不会变;
mysql > show global status like “open_tables”;
mysql > show global status like “opened_tables”;
提示:在设置table_cache的时候,可以参考open_tables的值;
【1.innodb_buffer_pool_size的设置】
该参数的作用是设置缓存innodb表和索引数据。这个值的设置越高,访问表中数据需要的磁盘I/O就越小;
【2.innodb_additional_mem_pool的设置】
该参数用来设置InnoDB存储的数据目录信息和其他内部数据结构的内存池大小。应用程序里的表越多,需要在这里分配越多的内存。对于一个相对稳定的应用,这个参数的大小也是相对稳定的。
【1.innodb_log_file_size的设置】
该参数的作用是设置日志组中每个日志文件的大小。该参数在高写入负载尤其是大数据集的情况下很重要,这个值越大则性能相对较高。
【2.innodb_log_files_in_group的设置】
该参数用于指定数据库中有几个日志组,默认为2个,因为有可能出现跨日志的大事务,所以一般来讲,建议使用3~4个日志组;
【3.innodb_log_buffer_size的设置】
该参数的作用是设置日志缓存的大小,一旦提交事务,则将该缓存池中的内容写到磁盘的日志文件上,该参数的设置在中等强度写入负载以及较短事务情况下,一般都可以满足服务器的性能要求。如果服务器负载较大,可以考虑加大该参数的值,一般缓存池中的内存每秒钟写到磁盘一次,所以设置较大会浪费内存空间,一般设置为8MB~16MB就足够了;
可以参考Innodb_os_log_written的值,如果该值增加过快,可以适当的增加该参数的值;
【4.innodb_flush_log_at_trx_commit的设置】
该参数是用来控制缓冲区的数据写入到日志文件和将日志文件数据刷新到新的磁盘的操作时间。对该参数的设置可以在数据库性能与数据库安全之间进行折中;
innodb_flush_log_at_trx_commit参数只有3个值,默认为1,也是最安全的设置。处于性能考虑,可以设置为0或者2,但会在数据库崩溃前丢失一秒钟的事务。为了保证事务的持久性和复制设置的一致性,建议将这个参数设置为1;
数据库数据存储和I/O的性能直接影响到数据库数据文件读写执行的效率,合理地分配存储和I/O方面的参数,将会提升数据库整体的性能;
【1.innodb_open_files的设置】
该参数的作用是限制InnoDB存储引擎在同一时间同时能打开表的数量,该参数默认值为300,如果数据库里面的表特别多,可以考虑增加该参数的值;
【2.innodb_flush_method的设置】
该参数的作用是设置InnoDB引擎与操作系统进行I/O交互模式,即刷新数据和日志的方法,该参数有三个选项:
(1)Fdatasync:
InnoDB使用fsync()函数去更新日志和数据文件。
(2)O_DSYNC:
InnoDB使用O_DSYNC模式打开并更新日志文件,使用fsync()函数去更新数据文件。
(3)O_DIRECT:
InnoDB使用O_DIRECT模式打开数据文件,使用fsync()函数去更新日志和数据文件;
【3.innodb_max_dirty_pages_pct的设置】
该参数的作用是控制Innodb的脏页在缓冲中的百分比,将脏页的比例控制在所设定的百分比值之下,如果该参数的值为50,则脏页在缓冲中最多只占50%。建议该参数设置为15~90,如果设置太大,缓存中每次更新需要置换的数据也太多;如果设置过小,可以存放脏数据页的缓冲区内存空间会很小,性能会受到一定的影响;
【1.max_connect_errors的设置】
max_connect_errors默认值为10,表示mysqld线程没有重新启动过,一台物理服务器只要连接异常中断累计超过10次,就再也无法连接上mysqld服务。建议大家设置此值的时候至少大小等于10。弱异常中断累计超过参数设置的值,有两种解决方法:可以重启mysqld服务或者执行FLUSH HOSTS 命令;
【2.interactive_timeout的设置】
该参数用于设置处于交互状态连接的活动被服务器端强制关闭后等待的时间;
【3.wait_timeout的设置】
该参数用于设置客户端与服务器在无交互状态连接到被服务器强制关闭而等待的时间。此参数只有针对基于TCP/IP或者基于Socket通信协议建立的连接才有效;
【4.query_cache_type的设置】
在mysqld中,对query_cache_type参数的定义如下:
该参数用于控制查询结果是否放到查询缓存中。查询缓存类型的可选值只能是0、1、2,具体选项的含义如下:
该参数选项设置为0,表示禁止查询缓存的功能;
该参数选项设置为1,表示启用查询缓存的功能,缓存所有符合要求的查询结果集;除了SELECT SQL_NO_CACHE…,以及不符合查询缓存设置的结果集外;
该参数选项设置为2,表示仅仅缓存SELECT SQL_CACHE…子句的查询结果集,除了不符合查询缓存设置的结果集之外。
【5.query_cache_size的设置】
在mysqld中,对query_cache_type参数的设置如下:
该参数用来设置查询缓存的大小,需要从以下几个方面考虑如何设置该参数的大小。
MySQL安装之后,可以通过对其中各个参数的修改进行优化数据库服务的性能。数据库日志对MySQL的I/O性能有很大的影响;
【查看二进制日志文件相关的参数】
mysql > show variables like ‘binlog’;
其中影响binlog_cache_size性能的参数主要如下:
Binlog_cache_use:
表示使用二进制日志缓存事务的数量;
Binlog_cache_disk_use:
该参数表示使用二进制日志缓存并且值达到binlog_cache_size设置的值,用临时文件存储事务的数量;
【max_binlog_cache_size】该参数表示二进制日志所使用缓存的最大值,该参数的默认值已经足够大了;
【Max_binlog_size】该参数代表二进制日志使用的最大值,如果系统中事务过多的话,而此参数的值设置过小,则会报错,该参数默认值为1G;
【Sync_binlog】该参数比较重要,不仅对数据完整性有影响,而且对数据库的性能也有影响,
Sync_binlog=0:表示当事务提交之后,不做文件系统之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而会让文件系统自行决定同步,或者cache满了之后才同步到磁盘。
Sync_binlog=n:表示当事务提交n次之后,将进行一次同步,将binlog_cache中的数据写入到磁盘;
注意:
Sync_binlog=0,这是数据库的默认设置,性能是最好的,不过也是最危险的,一旦系统崩溃,binlog_cache中的数据就会丢失。Sync_binlog=1的时候,是数据库消耗最大,不过安全性比较高,当事务提交之后,数据库会将缓存中的数据同步到磁盘中;
通常在MySQL的复制过程中,实际上就是将客户端的日志通过I/O复制到服务器端,然后服务器端将日志的数据解析出来应用到数据库中;
目前大多数应用都是以I/O密集型为主,存储技术远没有计算机中其他系统发展迅速,尽管也有不少高端的存储设备,不过考虑到成本的因素,一般用户承受不起;
实际上前面的SQL优化、数据库对象优化、数据库参数优化,以及应用程序优化等,都是想通过减少或者延缓磁盘的读写来减轻磁盘I/O的压力。另外,管理员可以通过增强磁盘I/O的吞吐量以及增强磁盘I/O本身的性能,从而提高数据库的整体性能;
【1、选择合适的RAID(磁盘阵列)级别】
RAID 就是将N台硬盘通过RAID Controller结合成虚拟单台大容量硬盘使用。根据数据冗余和分布方式,RAID分为不同的级别,下面是最常见的几种RAID级别;
【2、使用Symbolic Links分布I/O】
使用操作系统符号链接(Symbolic Links)将不同的数据库或者表、索引指向不同的物理磁盘,从而达到分布磁盘I/O的目的;
查看系统是否支持符号链接:
mysql > SHOW VARIABLES LIKE ‘have_symlink’;
注意:
在不使用RAID或者逻辑卷的情况下,要想达到分布式磁盘I/O的目的,可以使用操作系统的Symbolic Links将不同的数据库或者表、索引执行在不同的物理磁盘上面;
(1)将一个数据库指向其他物理磁盘,首先在目标磁盘上创建目录,然后再创建从MySQL数据目录到目标目录的符号连接,命令如下:
[root@localhost ~]# mkdir /otherdisk/databases/test
[root@localhost ~]# ln -s /otherdisk/databases/test /path/to/datadir
(2)对于新建的MyISAM表,可以使用DATA DIRECTORY 和INDEX DIRECORY来将表数据文件或者索引文件指向其他物理磁盘,命令如下:
Create table test(id int primary key,name varchar(20))
Type = myisam
DATA DIRCOTORY = ’/disk2/data’
INDEX DIRECTORY = ‘/disk3/index’
提示:对于已经存在的MyISAM表,可以将.MYD或者.MYI文件移动到目标磁盘,然后再建立符号链接即可;
MySQL数据库并发性能是影响数据整体性能的一个重要参数,通过提高并发连接数量来提升并发效率;
【查看允许同时连接的最大数量】
mysql > show variables like ‘max_connections’;
【查看允许同时使用的最大连接数】
mysql > show global status like ‘max_used_connections’;
max_used_connections/max_connections的值为80%左右比较合适。
一般情况下:max_used_connections参数在MySQL主机性能允许的范围内,可以考虑设置500~800之间比较合适。而参数max_connections是用户正在连接最大的数量,可以尽量设置的大一些;
【参数net_buffer_length设置的只是消息缓冲区的大小】
mysql > show global status like ‘net’;
【参数max_allowed_packet表示在网络传输中,一次传递数据量最大值】
mysql > show global status like ‘max_allowed_packet%’;
【参数back_log表示在MySQL的连接请求等待队列中允许存放的最大连接请求数】
系统的默认值为50,最大可以设置为65535;
mysql > show global status like ‘back_log%’;
线程优化主要是优化MySQL中与连接线程相关的系统参数以及状态变量。在MySQL中实现了一个线程池,将空闲的连接线程存放在线程池中,如果有新的请求,MySQL会检查线程池中是否有空闲的连接线程,如果没有会创建新的线程,如果线程池中有空闲的线程,会直接从线程池中取出空闲的线程;
【查看与连接线程相关的系统参数】
mysql > show variables like ‘thread%’;
table_cache是非常重要的MySQL性能参数,主要用于设置table高速缓存的数量。由于每个客户端连接都至少访问一个表,所以此参数的值与max_connections有关;
说明:内存越大,table_cache的默认值越大,对于table_cache加大之后,MySQL执行的效率也就变高了,同时产生死锁的记录也增大了,所以在平时维护的过程中,应该找到合适的值,从而在MySQL的性能和产生死锁的几率中找到平衡。
提示:
table_cache加大之后有可能存在文件描述符不够用的情况;
解决方法:设置参数open-files-limit限制系统打开文件的最大值;
这种方式的调整只是临时性的,如果换个中断连接,该值又会返回到原始值,可以考虑通过vi命令ulimit -n -5000写入到/etc/profile,服务器重启之后就可以生效,同时建议把/etc/security/limits.conf也修改下,还要把配置文件中把open_files_limit这个参数增大,对于4GB内存的数据库服务器,可以把open_files_limit至少增大到4096,如果没有什么特殊情况,设置为8192就可以了;
临时文件就是为了各种不同的目的,而产生的中间文件。使用完毕之后会被及时的回收和清理。临时表也是这样,是MySQL在进行一些内部操作的时候生成的数据库表。
这些操作主要包括group by、distinct、一些order by 查询语句、UNION和一些from语句中的子查询等;
可以使用EXPLAIN来分析查询语句,看看是否会用到临时表。
【查看临时文件、临时表和磁盘临时表的命令如下】
mysql > show global status like ‘create_tmp%’;
【MySQL对临时表的配置】
mysql> show variables where Variable_name in(‘max_heap_table_size’,’tmp_table_size’);
提示:如果有text或者是blog字段的时候,会导致不能使用内存临时表而用磁盘临时表;
tmp_table_size参数规定了内存临时表的最大值,如果内存临时表超过了限制,数据库会将数据存储在磁盘临时表中,存储的目录默认为/tmp/
【查看临时目录】
mysql > show variables like ‘tmpdir’;