文章目录
- mysql 优化
- SQL优化
- 服务器优化
- 连接——配置优化
- 优化器——SQL 语句分析与优化
- SHOW PROCESSLIST
mysql 优化
SQL优化
服务器优化
连接——配置优化
从服务端来说,我们可以增加服务端的可用连接数。
- show variables like ‘max_connections’; – 修改最大连接数,当有多个应用连接的时候
或者及时释放不活动的连接
- show global variables like ‘wait_timeout’;默认8小时
Druid 的默认最大连接池大小是8。Hikari 的默认最大连接池大小是10。
建议是机器核数乘以2 加1。也就是说,4 核的机器,连接池维护9 个连接就够了
内存参数配置
每一个connection内存参数配置:
sort_buffer_size connection排序缓冲区大小
建议256K(默认值)-> 2M之内
当查询语句中有需要文件排序功能时,马上为connection分配配置的内存大小
join_buffer_size connection关联查询缓冲区大小
建议256K(默认值)-> 1M之内
当查询语句中有关联查询时,马上分配配置大小的内存用这个关联查询,所以有可能在一个查询语句中会分配很多个关联查询缓冲区
上述配置4000连接占用内存: 4000*(0.256M+0.256M) = 2G
wait_timeout
innodb_open_files
innodb_write_io_threads/innodb_read_io_threads
innodb_lock_wait_timeout
优化器——SQL 语句分析与优化
慢查询日志分析 –
客户端连接数和服务端连接池
mysql> show variables like 'thread%';
+-------------------+---------------------------+
| Variable_name | Value |
+-------------------+---------------------------+
| thread_cache_size | 28 |
| thread_handling | one-thread-per-connection |
| thread_stack | 262144 |
+-------------------+---------------------------+
3 rows in set (0.00 sec)
mysql> show global status like '%Thread%';
+------------------------------------------+-------+
| Variable_name | Value |
+------------------------------------------+-------+
| Delayed_insert_threads | 0 |
| Performance_schema_thread_classes_lost | 0 |
| Performance_schema_thread_instances_lost | 0 |
| Slow_launch_threads | 0 |
| Threads_cached | 0 |
| Threads_connected | 1 |
| Threads_created | 1 |
| Threads_running | 1 |
+------------------------------------------+-------+
8 rows in set (0.01 sec)
Threads_cached : 当前线程池中缓存有多少空闲线程
Threads_connected : 当前的连接数 ( 也就是线程数 )
Threads_created : 已经创建的线程总数
Threads_running : 当前激活的线程数 ( Threads_connected 中的线程有些可能处于休眠状态 )
- **Threads_created:**创建过的线程数,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中 thread_cache_size 值
SHOW PROCESSLIST
显示用户正在运行的线程
SHOW FULL PROCESSLIST;
select * from information_schema.processlist;
按客户端 IP 分组,看哪个客户端的链接数最多
SELECT
client_ip,
COUNT(client_ip) AS client_num
FROM
(SELECT
SUBSTRING_INDEX(HOST, ':', 1) AS client_ip
FROM
information_schema.PROCESSLIST) AS connect_info
GROUP BY client_ip
ORDER BY client_num DESC;