mysql性能监控相关

若是是root账号,你能看到全部用户的当前链接。若是是其它普通账号,只能看到本身占用的链接mysql

怎么进入mysql命令行呢? mysql的安装目录下面有个bin目录,先用命令行进入该目录,而后用 mysql -uroot -p123456 来登陆(注意:用户名和密码不用包含“”) 
命令: show processlist; 
若是是root账号,你能看到全部用户的当前链接。若是是其它普通账号,只能看到本身占用的链接。 
show processlist;只列出前100条,若是想全列出请使用show full processlist; 
mysql> show processlist; 
命令: show status; 
命令:show status like '%下面变量%'; 
Aborted_clients 因为客户没有正确关闭链接已经死掉,已经放弃的链接数量。 
Aborted_connects 尝试已经失败的MySQL服务器的链接的次数。 
Connections 试图链接MySQL服务器的次数。 
Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。 
Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。 
Delayed_writes 用INSERT DELAYED写入的行数。 
Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。 
Flush_commands 执行FLUSH命令的次数。 
Handler_delete 请求从一张表中删除行的次数。 
Handler_read_first 请求读入表中第一行的次数。 
Handler_read_key 请求数字基于键读行。 
Handler_read_next 请求读入基于一个键的一行的次数。 
Handler_read_rnd 请求读入基于一个固定位置的一行的次数。 
Handler_update 请求更新表中一行的次数。 
Handler_write 请求向表中插入一行的次数。 
Key_blocks_used 用于关键字缓存的块的数量。 
Key_read_requests 请求从缓存读入一个键值的次数。 
Key_reads 从磁盘物理读入一个键值的次数。 
Key_write_requests 请求将一个关键字块写入缓存次数。 
Key_writes 将一个键值块物理写入磁盘的次数。 
Max_used_connections 同时使用的链接的最大数目。 
Not_flushed_key_blocks 在键缓存中已经改变可是还没被清空到磁盘上的键块。 
Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。 
Open_tables 打开表的数量。 
Open_files 打开文件的数量。 
Open_streams 打开流的数量(主要用于日志记载) 
Opened_tables 已经打开的表的数量。 
Questions 发往服务器的查询的数量。 
Slow_queries 要花超过long_query_time时间的查询数量。 
Threads_connected 当前打开的链接的数量。 
Threads_running 不在睡眠的线程数量。 
Uptime 服务器工做了多少秒。sql

关于上面的一些注释:数据库

若是Opened_tables太大,那么你的table_cache变量可能过小。 
若是key_reads太大,那么你的key_cache可能过小。缓存命中率能够用key_reads/key_read_requests计算。 
若是Handler_read_rnd太大,那么你极可能有大量的查询须要MySQL扫描整个表或你有没正确使用键值的联结(join)。 
能够根据“show status”命令返回的状态进行微调。我主要注意如下变量的数值,越小越好,最好为零:)
        Created_tmp_disk_tables
        Created_tmp_tables
        Created_tmp_files
        Slow_queries

 

 

1. Show status命令了解各类SQL的执行频率缓存

查看当前会话执行的各项命令统计 com_XXX服务器

show session status like 'Com_%' 其中session可省session

show status like 'Com_%'架构

显示全局统计使用并发

SHOW GLOBAL STATUS LIKE 'COM_%';负载均衡

clip_image004[4]

clip_image005[4]

2. 查看针对InnoDB存储引擎状态的统计分布式

SHOW GLOBAL STATUS LIKE 'Innodb_%'

clip_image006[4]

红色部分能够看到插入 删除 读取 更新的行的汇总数量。不管事务提交仍是回滚,都进行累加。

3. 查看试图链接mySQL服务器的次数

show global status like 'connections'

clip_image007[4]

4. 查看服务器工做时间

show global status like 'uptime'

练习2:经过explain 分析低效SQL的执行计划

1. 使用explain 分析SQL语句

explain select * from TStudent where studentID='00034'

clip_image008[4]

explain select * from TStudent where cardID like '%45%'

clip_image009[4]

2. 肯定问题并采起相应措施

若是出现对大表的全表扫描,应该在该列建立索引,而且尽可能避免使用like这样的条件进行查找。

explain select * from TStudent where studentID like '%3%'

clip_image010[4]

注意如下这个查询使用索引进行的,你们想一想为何?

explain select * from TStudent where studentID like '0003%'

clip_image011[4]

练习3:经过索引优化查询

3. 索引的存储分类

MySQL中的索引的存储类型目前只有BTREE和HASH,具体和表的存储引擎有关。myISAM和InnoDB存储引擎都支持BTREE。Memory/Heap存储引擎能够支持HASH和BTREE

4. MySQL如何使用索引-组合索引的使用

索引用户快速找出某一列中有一特定值的行,查询使用索引的主要条件是查询条件中使用索引关键字,多列索引只有在查询条件中使用最左面的前缀,才使用索引。

在TSCore表上建立了组合主键。

clip_image012[4]

查询

explain select * from TScore where studentID='00023'

clip_image013[4]

explain select * from TScore where subjectID='00001'

能够看到是全表扫描

clip_image014[4]

5. 条件语句中使用Like

explain select * from TStudent where studentID like '%3%'

clip_image010[5]

注意如下这个查询使用索引进行的,你们想一想为何?

explain select * from TStudent where studentID like '0003%'

clip_image011[5]

若是列是索引,查找空值使用索引,如下是给sname列建立索引

alter table `TStudent` add index indexName(sname)

查看查询计划

explain select * from TStudent where sname is null

clip_image015[4]

6. 不适用索引的状况

若是查询的结果站记录总数的大多数,就不适用索引。

若是条件语句中有or or前面的列有索引,后面列没索引,两个索引都不用。

若是列类型是字符串,必定要用' ' 不然不使用索引查询数据。

explain select * from TStudent where studentid=00051

clip_image016[4]

explain select * from TStudent where studentid='00051'

clip_image017[4]

7. 查看索引使用状况

show status like 'Handler_read%'

clip_image018[4]

8. 两个简单的实用的优化方法

按期分析和检查表

analyze table TStudent

本语句用于分析和存储表的关键字分布,分析的结果将可使的系统获得准确的统计信息,使得SQL可以生成正确的执行计划。

check table TStudent

本语句的做用是检查一个或多个表是否有错误,check table对MyISAM和InnoDB表有做用。

经常使用的SQL的优化

9. 优化Insert语句

若是从同一个客户端一次插入不少行,尽可能使用下面的语句,能大大缩减客户端与数据库之间的链接、关闭等消耗。

insert student values

(45,'李双江','212121212121212121121','北京海淀区','213322323232'),

(46,'冯玲娥','212121212121212121121','北京海淀区','213322323232'),

(47,'李双江','212121212121212121121','北京海淀区','213322323232')

不要使用如下语句

insert student values (45,'李双江','212121212121212121121','北京海淀区','213322323232');

insert student values (46,'冯玲娥','212121212121212121121','北京海淀区','213322323232');

insert student values (47,'李双江','212121212121212121121','北京海淀区','213322323232');

10. 使用delayed选项

若是从多个客户端插入不少行,能经过使用INSERT delayed语句获得更高的速度。其含义是让INSERT语句立刻执行,其实数据都被放在内存的队列中,并无真正写入磁盘。这比每条语句分别插入要快的多。LOW_PRIORITY恰好相反,在全部其余用户对表的读写完后才进行插入。

该参数支持MyISAM数据引擎。

clip_image019[4]

insert delayed student values (46,'冯玲娥','212121212121212121121','北京海淀区','213322323232');

11. 将索引文件和数据文件分别放到不一样的盘

12. RAID磁盘

13. 从文件装载一个表时,使用load data infile 比insert语句块20倍

14. 可使用一个索引来知足Order by,不须要额外的排序。Where条件和Order by 使用相同的索引,而且order by的顺序和索引顺序相同。

15. 优化嵌套子查询 子查询能够被更有效率的join替代,使用join不须要在内存中使用临时表。

16. MySQL如何优化or条件 两个条件必须有索引,不然不是用索引

优化数据库对象

练习4:优化表的数据类型

使用PROCEDURE ANALYSE()来对表进行分心,该函数能够对数据表中列的数据类型提出优化建议。

select * from TStudent PROCEDURE ANALYSE();

clip_image020[4]

经过拆分提升表的访问效率

17. 垂直拆分

将一个有不少列的表,分解成多个表,使用主键进行关联,可使数据行变小,一页就能存放更多的数据,使用jion进行链接。若是一个表,有的列经常使用,有些列不经常使用,就能够垂直拆分。

18. 水平拆分

根据一列或多列数据的值把数据行放到两个队表中。如下状况使用水平拆分

1. 表很大 分割后能够下降查询时须要读的数据和索引的页数。同时也下降了索引的层数,提升查询速度。

2. 表中的数据有很强的独立性 好比表中数据,记录不一样地区或不一样时间的数据。特别是有些数据经常使用,有些不经常使用。

3. 须要把数据放到多个介质上。放到不一样的硬盘。

这种查询须要使用多个表名,使用UNION将结果链接起来,增长了操做的复杂性。

逆规范化

规范化,下降了数据冗余,以及数据修改引发的数据不一致。可是须要多个表进行jion,下降了查询的性能,为了性能考虑,不严格使用规范化设计数据库。

反规范化的好处,下降链接操做的需求,下降外键和索引的数目,还能减小表的数量。

经常使用的反规范化技术有:

1. 增长数据冗余

2. 增长派生列

3. 从新组表

4. 分割表

反规范化技术须要维护数据的完整性。经常使用的维护完整性方法有:

5. 批处理 是指按期运行批处理做业或存储过程对派生列进行修改,这在实时性要求不高的状况使用

6. 由应用逻辑来实现 使用事务,在一个事务中对全部涉及到的表进行增删改操做。由于同一逻辑必须在全部应用中使用和维护,容易遗漏,特别是在需求变化大时,不易维护。

7. 使用触发器实现,易于维护。

使用中间表提升统计查询速度

好比一个表记录了客户天天的消费记录,你须要统计用户本周客户消费总金额和近一周不一样时间段用户的消费总金额。你就应该将本周的数据插入到一个新表,而后使用新表进行统计。

优势:

8. 中间表与源表隔离

9. 中间表能够灵活添加索引或增长临时用字段。从而达到提升统计查询效率和辅助统计查询的做用。

锁问题

MySQL不一样的存储引擎支持不一样的锁机制。myISAM和MEMORY存储引擎采用表级锁;BDB存储引擎采用的是页面锁,也支持表级锁;InnoDB及支持行级锁、也支持表级锁,默认状况是采用行级锁。

MySQL有三个级别的锁。

三种锁地特性:

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的几率最高,并发度最低。

行级锁:开销稍大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的几率最低,并发度也最高。

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度通常。

练习5:查看锁

这是myISAM存储引擎支持表锁,这也是早起mySQL版本中惟一支持的锁类型。

19. 查询表级锁争用状况

show status like 'table%'

clip_image021[4]

20. 查看锁

当上面出现锁等待的状况下,使用putty链接输入如下命令

show global status like 'innodb_row_lock%'

clip_image022[4]

Innodb_row_lock_current_waits:当前正在等待锁定的数量;

Innodb_row_lock_time:从系统启动到如今锁定总时间长度;

Innodb_row_lock_time_avg:每次等待所花平均时间;

Innodb_row_lock_time_max:从系统启动到如今等待最常的一次所花的时间;

Innodb_row_lock_waits:系统启动后到如今总共等待的次数;

输入如下命令,查看全局的表锁

show global status like 'table%'

clip_image023[4]

若是Table_locks_waited的值比较高,则说明存在着较严重的表级锁争用状况。

Table_locks_immediate表示当即释放表锁数

等待的锁很少,就不须要使用InnoDb

优化mySQL

练习6:查看mysql参数

和大多数数据库同样,MySQL也提供了不少参数来进行服务器的设置。

21. 查看mySQL Server参数

show variables

clip_image024[4]

查看当前会话状态

show status

clip_image025[4]

查看全局状态

show global status

clip_image026[4]

22. 影响mySQL性能的重要参数

将索引加到缓存,可以提升查找速度。

绝大多数参数不须要用户调整,key_buffer_size参数,用来设置索引块缓存的大小,被全部线程共享,此参数适用于MyISAM存储引擎。

使用putty链接mySQL设置这个参数

set global hot_cache2.key_buffer_size=128*1024;

global标识对每个新的链接,此参数都将生效,hot_cache2是新的key_buffer名称。

而后能够把相关表的索引放到指定的索引缓存中。

将相关表索引放到指定的索引缓存中。

clip_image027[4]

能够看到有两个索引

clip_image028[4]

将TStudent表的索引加载到缓存。

clip_image029[4]

磁盘I/O问题

使用磁盘阵列

23. RAID技术

RAID-0 读写快 无冗余

RAID-1 读快 写通常 有冗余 有一半的磁盘浪费

RAID-10 先作RAID-1 在作RAID -0 读写性能好

RAID-4 使用一个单独的磁盘存放校验数据,当一个磁盘坏掉,

RAID-5 将校验数据分布在多个磁盘 写性能不如RAID 0、RAID 1和RAID 10,出现坏盘,读性能降低。

RAID技术有硬件实现的也有软件实现的,即操做系统实现的。

应用优化

减小对mySQL的访问

要想提升访问速度,可以一次链接就能取的全部结果,就不要分两步。这样可以大大减小对数据库无谓的重复访问。

例如

第一个查询获得用户学号和姓名

Select studentID,sname from TStudent where studentID='00005'

第二个查询获得用户的班级

Select class from TStudent where studentID='00005'

这样就须要想数据库提交两次查询。

使用一个SQL语句实现,将class放到变量以备后用。

Select studentID,sname, class from TStudent where studentID='00005'

练习7:使用查询缓存

MySQL的查询缓存,就是将select语句查询的结果放到缓存,再遇到个相同的查询,服务器就会从查询缓存中从新获得查询结果,再也不须要解析和执行查询。

适合更新不频繁的表。表结构和数据更改后,查询缓存值的相关条目被清空。

show variables like '%query_cache%'

clip_image030[4]

按顺序执行如下命令查看缓存的数量

show status like 'Qcache%'

Select class from TStudent where studentID='00046';

Select class from TStudent where studentID='00056'

show status like 'Qcache%'

clip_image031[4]

增长cache层

在应用端增长cache层来减轻数据库负担的目的,cache层有不少种,也有不少证明现方式。

好比,把部分数据从数据库抽取出来放到应用端以文本形式存储,若是有查询需求就直接重文本(cache)中查询。因为cache中数据量小,可以达到较高的访问效率。可是也涉及到数据更新,须要及时刷新cache。

负载均衡

负载均衡是一种在实际应用中很是广泛的方法。从Web服务器到数据库服务器均可以使用负载均衡。如今介绍mySQL负载均衡方法。

利用mySQL复制分流查询操做

主服务器负载数据更改,从服务器负载查询。数据复制的延迟须要考虑。

采用分布式数据库架构

MySQL cluster适用于大数据量,负载高的状况,有良好的扩展性和高可用性。

相关文章
相关标签/搜索