Mysql调优
影响处理速度的因素
硬件配置低
网络带宽窄
存储架构不合理
复杂的查询语句
服务运行参数设置不合理
启用慢查询日志
保存耗时较长的日志
shell
vim /etc/my.cnf
[mysqld]
slow-query-log #启用慢查询
long-query-time=0.3 #查询超时时间
systemctl restart mysqld
统计日志信息
shell
ls /var/lib/mysql/主机名-slow.log
mysqldumpslow /var/lib/mysql/主机-slow.log > sql.txt
设置查询缓存
查询的内容如果在查询缓存中有,则从查询缓存中拿取,没有则从硬盘里查询,保存到查询缓存中,在进行拿取。
shell
mysql> show variables like "%query_cache%";
#have_query_cache YES 启用缓存查询
#query_cache_type YES 允许查找的内容放入查询缓存里
#query_cache_size 缓存大小
shell
vim /etc/my.cnf
[mysqld]
query_cache_size=10485760 #10M
query_cache_type=ON #ON、OFF、DEMAND(按需缓存)
systemctl restart mysqld
验证内容是否在查询缓存里查找的
shell
mysql> show status like "%qcache%";
#Qcache_hits 0 在缓存里找到的数据
#Qcache_inserts 0 在硬盘里找到的数据
mysql> show status like "%com_select%"; #查询访问总量,内存里找的不会变
#查询缓存命中率 = (Qcache_hits / Com_select) * 100% 数字越低越好
创建索引
创建索引
shell
mysql> create index 名称 on 库.表(表头名);
删除索引
shell
mysql> drop index 名称 on 库.表;
测试索引
shell
mysql> explain select 查询命令;
设置索引缓存
索引缓存:划分物理内存空间,单独存放索引信息:表名.MYI (/var/lib/mysql/库/表.MYI)
shell
mysql> show variables like "key_buffer_size"; #默认给的缓存大小,默认8M,也是.myi的大小,通过/etc/my.cnf更改大小
mysql> show global status like "key_read%";
#Key_read_requests 6 索引请求总数
#Key_reads 3 磁盘IO总数
#Key_reads / Key_read_requests 比例越小越好,修改的size越合理
补充:
查询访问多的表,使用myisam存储引擎
desc 表名 来自:表名.frm (结构)
show index 来自:表名.MYI (索引)
select * 来自:表名.MYD (数据)
Innodb存储引擎:.frm + .idb(索引+数据)
设置缓存表
访问表存放在/var/lib/mysql/库/表.MYD 表.ibd,先打开文件------>查询------>关闭,第二次也是这个动作
缓存表:可以同时打开多表,不用关闭
查看已打开、打开过多少个表
shell
mysql> show global status like "open%tables";
#open_tables <= open_table_cache值 并且 Opened_tables值变化不大
查看可以缓存的表,可以同时打开多少张表,不用关闭
shell
mysql> show variables like "table_open_cache";
设置并发连接数
查看并发连接
shell
mysql> show variables like "max_connections";
max_connections #允许的最大并发连接数
mysql> show status like "Max_used_connections";
Max_used_connections #当前最大连接数
shell
Max_used_connections / max_connections * 100% ≈ 85%
设置重用线程
可以重复使用的线程数量,不销毁处理完访问连接的线程,让线程继续在内存里运行着,等待客户端连接
查看重用线程
shell
mysql> show variables like "thread_%_size";
thread_cache_size 9 #查看可以重用的线程
查看当前线程状态
shell
mysql> show global status like "threads_%";
Threads_running 1 #正在活跃的线程
Threads_created 4 #已创建的线程
Threads_connected 3 #当前正在连接的线程
Threads_cached 2 #缓存的线程
Threads_connections <= thread_cache_size #合理