Answer

问题及解答

优化MySQL

Posted by haifeng on 2019-05-01 10:40:01 last update 2019-05-01 13:57:15 | Edit | Answers (0)

要进行优化, 必须先知道问题在哪里.

如果使用 phpMyAdmin, 可以查看【状态】-->【建议】


开启慢查询

 

一般建议启动慢查询日志, 因为 MySQL 默认是关闭的.

如果是 Linux 系统, 则配置文件 my.cnf 一般位于 /etc/mysql/my.cnf

使用 root 用户或其他有权限的账号编辑此文件, 找到 [mysqld] (如果使用 vim, 则键入 /\\[mysqld\\], 而不是 /[mysqld])

在这一段中找到

#log_slow_queries        = /var/log/mysql/mysql-slow.log
#log_query_time = 2

将前面的注释符#去掉, 保存.

注意这里 log_query_time = n, n 指的是秒数, 超过这个时间的查询语句将被记录. 根据具体使用的环境, 一般设置 n为 1~5秒

 

查询缓存使用情况

mysql> show status like 'Qcache%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 3        |
| Qcache_free_memory      | 16373216 |
| Qcache_hits             | 322      |
| Qcache_inserts          | 283      |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 59       |
| Qcache_queries_in_cache | 175      |
| Qcache_total_blocks     | 391      |
+-------------------------+----------+
8 rows in set (0.00 sec)

 

References:

https://www.cnblogs.com/sunss/archive/2010/10/13/1850407.html

 


 

InnoDB 日志文件大小设置的问题

 

问题:
InnoDB 日志文件大小不合适,此关系到 InnoDB 缓冲池。

建议:
在一个 InnoDB 表写入很多的系统上您应该将 innodb_log_file_size 设为 innodb_buffer_pool_size 的 25% 。因为该值越大,当数据库崩溃时恢复的时间就越长,所以该值不应高于 256 MB 。请注意您不能简单的修改该变量的值。您需要关闭服务器,删除 InnoDB 日志文件,在 my.cnf 中设置新的值,启动服务器,一切正常后再检查错误日志。参见这篇博客

现状:
您的 InnoDB 日志大小为 InnoDB 缓冲池大小的 3.9%,该值不应低于 20%

使用的变量/公式:
innodb_log_file_size / innodb_buffer_pool_size * 100

检验:
value < 20 && innodb_log_file_size / (1024 * 1024) < 256

mysql> show variables like 'innodb_log%';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| innodb_log_buffer_size    | 8388608 |
| innodb_log_file_size      | 5242880 |
| innodb_log_files_in_group | 2       |
| innodb_log_group_home_dir | ./      |
+---------------------------+---------+
4 rows in set (0.00 sec)

mysql> show variables like 'innodb_buffer%';
+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| innodb_buffer_pool_instances | 1         |
| innodb_buffer_pool_size      | 134217728 |
+------------------------------+-----------+
2 rows in set (0.00 sec)


打开 /etc/mysql/my.cnf
找到 InnoDB 所在行(一些描述),
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!

增加下面两行

innodb_log_file_size=32M
innodb_buffer_pool_size=128M

关闭mysqld,
# service mysqld stop

删除 /var/lib/mysql/ 下面的 ib_logfile0, ib_logfile1, ..., ib_logfileN
# cd /var/lib/mysql
# rm ib_logfile0 ib_logfile1

启动 mysqld
# service mysqld start