Mysql 优化

杀掉mysql所有连接
mysqladmin -uroot -h127.0.0.1 -p123456  processlist |awk -F "|" '{print $2}' | xargs -n 1 mysqladmin -uroot -p123456 kill

杀掉joe用户连接     awk -F 指定分隔符
mysqladmin -uroot -h127.0.0.1 -p123456 processlist | awk -F "|" '{if($3 == "joe")print $2}'|xargs -n 1 mysqladmin -uroot -p123456 kill
show engine innodb status;

每隔一秒查询一次     grep  -r 递归  -E 正则
mysqladmin -p123456 extended-status -ri1|grep -r -E 'Queries|Threads_connected|Threads_running'

查看queries
mysqladmin -uroot -p123456 ext|awk '/Queries/{printf("%d",$4)}'

查看Queries   Threads_connected   Threads_running
mysqladmin -uroot -p123456 ext|awk '/Queries/{printf("%d ",$4)}/Threads_connected/{printf("%d ",$4)}/Threads_running/{printf("%d\n",$4)}'

mysql -e 不登陆执行命令
mysql -p123456 -e "use owl-test;show tables"
如果explain出来的type列的值为index,则说明Mysql使用了索引扫描来排序

Mysql查询缓存             查询缓存命中率 = Qcache_hits/(Qcache_hits+Com_select)

如果有大量查询缓存未命中,但是实际上绝大多数查询都被缓存了,那么可能是如下情况发生:
1、查询缓存还没有完成预热
2、查询语句之前从未执行过。如果你的应用程序不会重复执行一条查询语句,那么即使完成预热仍然会有很多缓存未命中
3、查询缓存失效操作太多了

缓存磁片、内存不足、数据修改都会造成缓存失效。如果配置了足够的缓存空间,而且query_cache_min_res_unit设置也合理的话,那么缓存失效应该主要是数据修改导致的。
可以通过参数Com_*来查看数据修改情况(包括Com_update,Com_delete)

Com_select 变量记录的是无缓存的查询次数+错误查询+权限检查查询。
Com_update  Com_delete 查看数据修改情况  备注:高性能Mysql第315页

mysql> show status like '%Qcache%';         显示查询缓存状态
+-------------------------+-----------+
| Variable_name           | Value     |     flush query cache  清理查询缓存碎片
+-------------------------+-----------+
| Qcache_free_blocks      | 252       |     表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了
| Qcache_free_memory      | 102288040 |     查询缓存的剩余内存大小
| Qcache_hits             | 467280    |     有多少次命中缓存        通常Qcache_hit:Qcache_inserts大于3:1时查询缓存是有效的
| Qcache_inserts          | 430281    |     多少次未命中然后插入
| Qcache_lowmem_prunes    | 0         |     该参数记录有多少条查询因为内存不足而被移除出查询缓存
| Qcache_not_cached       | 511699    |     由于query_cache_type的设置而没有被缓存的查询数量
| Qcache_queries_in_cache | 1139      |     当前缓存中缓存的查询数量。
| Qcache_total_blocks     | 2573      |     缓存中块的数量
+-------------------------+-----------+

减少碎片: 
合适的query_cache_min_res_unit可以减少碎片,这个参数最合适的大小和应用程序查询结果的平均大小直接相关,
可以通过内存实际消耗(query_cache_size - Qcache_free_memory)除以Qcache_queries_in_cache计算平均缓存大小。

mysql> show variables like '%query_cache%';     显示查询缓存
+------------------------------+-----------+
| Variable_name                | Value     |     
+------------------------------+-----------+
| have_query_cache             | YES       |
| query_cache_limit            | 1048576   |
| query_cache_min_res_unit     | 1024      |
| query_cache_size             | 104857600 |
| query_cache_type             | ON        |
| query_cache_wlock_invalidate | OFF       |
+------------------------------+-----------+

mysql> show global status like 'key_read%';     查看索引缓冲
+-------------------+---------+
| Variable_name     | Value   |
+-------------------+---------+
| Key_read_requests | 1836662 |                 有183662个索引请求
| Key_reads         | 6       |                 6个未命中直接从硬盘读取
+-------------------+---------+

mysql> show global status like '%created_tmp%'; 查看临时表
+-------------------------+--------+
| Variable_name           | Value  |
+-------------------------+--------+
| Created_tmp_disk_tables | 24794  |            在磁盘创建临时表次数
| Created_tmp_files       | 37     |            在磁盘创建临时文件次数
| Created_tmp_tables      | 267314 |            使用临时表总次数
+-------------------------+--------+


TmpTable的状况主要是用于监控MySQL使用临时表的量是否过多,
是否有临时表过大而不得不从内存中换出到磁盘文件上。 a.如果:Created_tmp_disk_tables/Created_tmp_tables>10%,
则需调大tmp_table_size比较理想的配置是:Created_tmp_disk_tables/Created_tmp_tables<=25%b.如果:Created_tmp_tables非常大 ,
则可能是系统中排序操作过多,或者是表连接方式不是很优化。

mysql> show status like 'Threads_%';             查看当前线程状态
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 89    |
| Threads_connected | 23    |
| Threads_created   | 115   |
| Threads_rejected  | 0     |
| Threads_running   | 3     |
+-------------------+-------+

Buffer pool
innodb即缓存表又缓存索引,还有设置多个缓冲池以增加并发,很像oracle 采用LRU算法:
所有buffer块位于同一列表,其中后3/8为old,每当新读入一个数据块时,先从队尾移除同等块数然后插入到old子列的头部,如再次访问该块则将其移至new子列的头部

Innodb_buffer_pool_size:  buffer pool大小
Innodb_buffer_pool_instances: 子buffer pool数量,buffer pool至少为1G时才能生效
Innodb_old_blocks_pct: 范围5 – 95, 默认为37即3/8,指定old子列的比重
Innodb_old_blocks_time: 以ms为单位,新插入old子列的buffer块必须等待指定时间后才能移入new列,适用于one-time scan频繁的操作,以避免经常访问的数据块被剔出buffer pool
 
可通过状态变量获知当前buffer pool的运行信息
Innodb_buffer_pool_pages_total:        缓存池总页数
Innodb_buffer_pool_bytes_data:         当前buffer pool缓存的数据大小,包括脏数据
Innodb_buffer_pool_pages_data:         缓存数据的页数量
Innodb_buffer_pool_bytes_dirty:        缓存的脏数据大小
Innodb_buffer_pool_pages_diry:         缓存脏数据页数量
Innodb_buffer_pool_pages_flush:        刷新页请求数量
Innodb_buffer_pool_pages_free:         空闲页数量
Innodb_buffer_pool_pages_latched:      缓存中被latch的页数量,这些页此刻正在被读或写;然而计算此变量比较消耗资源,只有在UNIV_DEBUG被定义了才可用
Innodb_buffer_pool_pages_misc:         用于维护诸如行级锁或自适应hash索引的内存页=总页数-空闲页-使用的页数量
Innodb_buffer_pool_read_ahead:         预读入缓存的页数量
Innodb_buffer_pool_read_ahead_evicted   预读入但是1次都没用就被剔出缓存的页
Innodb_buffer_pool_read_requests        InnoDB的逻辑读请求次数
Innodb_buffer_pool_reads:              直接从磁盘读取数据的逻辑读次数
Innodb_buffer_pool_wait_free:          缓存中没有空闲页满足当前请求,必须等待部分页回收或刷新,记录等待次数
Innodb_buffer_pool_write_requests:     向缓存的写数量


你可能感兴趣的:(Mysql 优化)