您的位置:首页 > 数据库 > MySQL

Mysql性能优化小建议

2014-12-24 12:07 507 查看
Mysql的性能优化主要参考文章[1][2],和[3],其中已使用且比较有效果的有:

1. 实用优化

(1)禁止autocommit, 防止每次插入都提交,刷新log

SET autocommit=0;
... SQL import statements ...
COMMIT;
(2) 对频繁查询的字段建立索引,但要注意加入索引后,执行插入操作时会变慢

(3)当只要一行数据时使用 LIMIT 1

SELECT 1 FROM tbl_name LIMIT 1
注:SELECT 1 是用来查看是否有记录的,并一般用作条件查询(normally it will be used with WHERE and often EXISTS), 返回的所有行的值都是1。效率上来说,1>anycol>*,因为不用查字典表。[4]

(4)永远为每张表设置一个ID

为数据库里的每张表都设置一个ID做为其主键,而且最好的是一个INT型的(推荐使用UNSIGNED),并设置上自动增加的AUTO_INCREMENT标志。

(5)一次插入多行

INSERT INTO yourtable VALUES (1,2), (5,5), ...;


2. 配置优化

下面对Disk I/O和query_cache的优化做一个总结,并假设我们使用的机器内存为8GB。以下的参数都在文件my.cnf的[mysqld]下设置。

(1)innodb_buffer_pool_size 和 innodb_log_file_size

建议设置大小来自文章[5]

#
# Set buffer pool size to 50-80% of your computer's memory
innodb_buffer_pool_size=4G
innodb_additional_mem_pool_size=256M
#
# Set the log file size to about 25% of the buffer pool size
innodb_log_file_size=1G
innodb_log_buffer_size=256M
怎么安全的更改这个配置,来自于[6]

mysql -uroot -p... -e"SET GLOBAL innodb_fast_shutdown = 0"
service mysqld stop
rm -f /var/lib/mysql/ib_logfile[01]
service mysqld start
其中 service mysqld stop是centos下的命令,但ubuntu等其他Linux系统可能实用service mysql stop

(2)query_cache_size

参数的说明见文章[7] ,但并未提到建议大小,反而提到设置太大也会有坏处。本人设置的大小如下:

query_cache_type=1
query_cache_limit=2M
query_cache_size=128M
其中query_chache_type=1表示打开查询缓存,query_cache_size是总的查询缓存大小,query_cahce_limit表示单个查询最大的缓存大小。

设置完之后,执行以下操作便可:

service mysqld restart
(3) innodb_flush_method

innodb_flush_method设置成O_DIRECT还是O_DSYNC,文章[2]中说设置成O_DIRECT会增加性能,但在文章[8]和[2]中这两个参数在实际使用时差不多,并且跟具体使用的硬件相关。所以设置成O_DIRECT是否会优化性能,还不是很确定

(4)max_allowed_packet

此参数是当网络传输数据时,需要控制的参数,如果传输的数据太大(特别是当存在large BLOB columns or long strings数据时),超过max_allowed_packet的上限时,就有可能发生错误,所以就要提高此参数。本人的设置是:

max_allowed_packet = 16M


注:

1. 查看系统变量的一些命令

show variables like 'innodb_buffer%';
SHOW GLOBAL STATUS LIKE '%innodb%';
show global status like 'Qc%';
2. 本人的配置



Reference

[1]
InnoDB Performance Tuning Tips

[2]
How to improve MySQL INSERT and UPDATE performance?

[3]
MySQL性能优化的最佳20+条经验

[4]
select 1 from ... sql语句中的1代表什么意思?

[5]
InnoDB Configuration

[6]
How to safely change MySQL innodb variable 'innodb_log_file_size'?

[7]
Query Cache Configuration

[8]
mysql setting variable innodb_flush_method to O_DSYNC or O_DIRECT
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: