常用优化参数 vim /etc/my.cnf 添加:
query_cache_type=1 #将会缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存
query_cache_size = 32M #对查询进行缓存 查询缓存
table_open_cache=512 #缓存23个表 table_cache 的值在 2G 内存以下的机器中的值默认从 256 到 512个。对于有 1G 内存推荐值是 128-256。
key_buffer_size=512M #索引缓存,根据内存大小而定,如果是独立的DB服务器,可以设置高达80%的内存总量
max_connections=1000 #最大连接数 上限是看硬件配置
wait_timeout=10 #设置超时时间,能避免长连接
max_connect_errors = 100 #设置失败连接数
slow_query_log = 1 #开启慢查询日志
slow-query-log-file=/usr/local/mysql/slow.log #这个路径对 MySQL用户具有可写权限
long_query_time=5 #查询超过 5 秒钟的语句记录下来
log-queries-not-using-indexes =1 #没有使用索引的查询
启动查询缓存:
vim /etc/my.cnf 添加:
[mysqld] #在此字段中添加
query_cache_type=1
query_cache_size = 32M
query_cache_type参数用于控制缓存的类型,注意这个值不能随便设置,必须设置为数字,如果设置为0,那么可以说,你的缓存根本就没有用,相当于禁用了。
如果设置为1,将会缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存。
如果设置为2,则只缓存在select语句中通过SQL_CACHE指定需要缓存的查询。
查看:查询缓存
重启 systemctl restart mysqld
查看缓存是否开启 show variables like '%query_cache%';
mysql> show variables like '%query_cache%';
+------------------------------+-----------+
| Variable_name | Value |
+------------------------------+-----------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 134217728 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+-----------+
6 rows in set (0.01 sec)
show status like 'qcache%'; #查看缓存
mysql> show status like 'qcache%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 134009224 |
| Qcache_hits | 1424 |
| Qcache_inserts | 479 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 1807 |
| Qcache_queries_in_cache | 134 |
| Qcache_total_blocks | 283 |
+-------------------------+-----------+
8 rows in set (0.00 sec)
解释如下:
变量名 说明
1. Qcache_free_blocks 缓存中相邻内存块的个数。数目大说明可能有碎片。
Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了,可能在一定的时间进行整理。 减少碎片: 合适的query_cache_min_res_unit可以减少碎片,这个参数最合适的大小和应用程序查询结果的平均大小直接相关,可以通过内存实际消耗( query_cache_size - Qcache_free_memory )除以 Qcache_queries_in_cache 计算平均缓存大小。
可以通过 Qcache_free_blocks 来观察碎片,这个值反应了剩余的空闲块,如果这个值很多,但是
Qcache_lowmem_prunes 却不断增加,则说明碎片太多了。可以使用 flush query cache 整理碎片,重新排序,但不会清空,清空命令是reset query cache。整理碎片期间,查询缓存无法被访问,可能导致服务器僵死一段时间,所以查询缓存不宜太大。
2. Qcache_free_memory 缓存中的空闲内存大小
3. Qcache_hits 每次查询在缓存中命中时就增大。
4. Qcache_inserts 表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理 后把结果insert到查询缓存中。次数越多, 表示查询缓存应用到的比较少,效果也就不理想
5. Qcache_lowmem_prunes #因内存不足删除缓存次数,缓存出现内存不足并且必须要进行清理,以便为更多查询提供空间的次数。返个数字最好长时间来看;如果返个数字在不断增长,就表示可能碎片非常严重,或者缓存内存很少。
如果Qcache_free_blocks比较大,说明碎片严重。 如果 free_memory 很小,说明缓存不够用了。
6. Qcache_not_cached # 表示因为query_cache_type的设置而没有被缓存的查询数量。
7. Qcache_queries_in_cache # 在当前缓存的查询(和响应)的数量。
8. Qcache_total_blocks #缓存中块的数量。
[mysqld]
symbolic-links=0 #禁止禁用符号链接,以防止各种安全风险。
query_cache_size = 32M #数据库缓存
max_connections=500 #最大连接数
wait_timeout=10 #等待时间10s
max_connect_errors = 100 #连接的最大错误数
mysql> show status like 'max_used_connections';
| Max_used_connections | 27 |#当前有27个连接mysql
表高速缓存:
数据库中的每个表存储在一个文件中,要读取文件的内容,你必须先打开文件,然后再读取。为了加快从文件中读取数据的过程,mysqld 对这些打开文件进行了缓存,其最大数目由 /etc/my.cnf中的 table_cache 指定
table_open_cache=512 #缓存512个表
table_cache 的值在 2G 内存以下的机器中的值默认从 256 到 512个。
对于有 1G 内存的机器,推荐值是 128-256。
mysql> show global status like 'open%_tables';
mysql> show global status like 'open%_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables | 835 |
| Opened_tables | 906 |
+---------------+-------+
2 rows in set (0.01 sec)
Open_tables 表示打开表的数量,Opened_tables表示打开过的表数量,如果Opened_tables数量过大,说明配置中 table_cache(5.1.3之后这个值叫做table_open_cache)值可能太小.
关键字缓冲区
key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。
key_buffer_size=512M #只跑一个MySQL服务。结合所有缓存,MySQL整体使用的缓存可以使用物理内存的80%
查看:
mysql> show status like '%key_read%';
mysql> show status like '%key_read%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Key_read_requests | 6 |
| Key_reads | 3 |
+-------------------+-------+
2 rows in set (0.00 sec)
Key_reads 代表命中磁盘的请求个数,Key_read_requests 是总数, 命中磁盘的读请求数除以读请求总数就是不中比率。
命中率:(1-(Key_reads / Key_read_requests ) )*100
如果每 1,000 个请求中命中磁盘的数目超过 1 个,就应该考虑增大关键字缓冲区了。