MySql:监控及优化

1、mysql的生命周期

①MySql服务器监听3306端口

②验证访问用户

③创建mysql线程

④检查内存(Qcache)

⑤解析sql

⑥生成查询计划

⑦打开表

⑧检查内存(Buffer Pool)

⑨到磁盘取数据

⑩写入内存

①①返回数据给客户端

①②关闭表

①③关闭线程

①④关闭连接

2、mysql配置

linux下两种进入mysql的方式:

  ①设置别名

  ②将mysql的/opt/lampp/bin/目录加入环境变量

  ③让设置的别名永久生效

    vi ~/.bashrc

    alias my=‘/opt/lampp/bin/mysql -uroot -p123456‘

    source ~/.bashrc

mysql安装完成后,最大默认连接数是100,连接数设置小的话,会影响性能

mysql配置文件的位置:

  [[email protected] ~]# find / -name my.cnf

  /opt/lampp/etc/my.cnf → 使用lampp的mysql

  /etc/my.cnf → Linux系统自带mysql配置文件的位置

mysql设置编码方式:

  [client]
  default-character-set=utf8
  [mysql]
  default-character-set=utf8
  [mysqld]
  character-set-server=utf8

mysql最大连接数设置:

  在配置文件的[mysqld]下面

修改配置文件后,需要重启mysql:

  /opt/lampp/lampp stopmysql

  /opt/lampp/lampp startmysql

  max_connections=1000#mysql的最大连接数

  wait_timeout=10 超时时间

  show status like ‘%Threads_connected%‘;查看当前连接数

  show processlist;#查看当前连接数

3、缓存

queryCache(Mysql层):
  ①数据有变化的时候,缓存就失效了
  ②select语句必须一模一样才能走缓存,只要有一点不一样就不会走
  ③任何一个包含不确定的函数(比如now(),current_date())的查询不会被缓存

开启qcache:

  在mysql配置文件中添加,linux下为my.cnf,windows下为my.ini

  在配置文件的[mysqld]下面
    query_cache_type = on#开启缓存
    query_cache_size = 10M #总大小
    query_cache_limit = 1M #select查询结果超过设置值,就不会被缓存
  SHOW VARIABLES LIKE ‘%query_cache%‘;查看queryCache状态

开启profile:
  set @@profiling=1;#设置profile开启
  select @@profiling;#查看profile是否被开启
  show profiles;#查看所有的profile
  show profile for query n;查看指定的sql语句

queryCache使用状态:
  SHOW STATUS LIKE ‘Qcache%‘;#使用状态监控
    Qcache_free_memory Query Cache 中目前剩余的内存大小
    Qcache_hits 缓存命中次数
    Qcache_inserts 多少次未命中然后插入
    Query Cache 命中率= Qcache_hits / ( Qcache_hits + Qcache_inserts );
    Qcache_free_blocks Query Cache中目前还有多少剩余的blocks。如果该值显示较大,则说明Query Cache 中的内存碎片较多了,可能需要寻找合适的机会进行整理。
    如果这个值非常大,可以使用FLUSH QUERY CACHE;语句来清理查询缓存碎片以提高内存使用性能。该语句不从缓存中移出任何查询。

4、存储引擎

Innodb 存储引擎
  支持外键、支持事物,行级锁,innodb
MyISAM
  MyISAM表不支持事务
  MyISAM表不支持外键(Foreign Key)。
  Innodb是行级锁,myisam是表锁
开启innodb_buffer_pool
  在配置文件的[mysqld]下面
  innodb_buffer_pool_size=20M #设置bufferpool大小
  innodb_buffer_pool_dump_now=on#默认为关闭OFF。如果开启该参数,停止MySQL服务时,InnoDB将InnoDB缓冲池中的热数据保存到本地硬盘。
  innodb_buffer_pool_load_at_startup = off#默认为关闭OFF 。如果开启该参数,停止MySQL服务时,InnoDB将InnoDB缓冲池中的热数据保存到本地硬盘。
  SHOW VARIABLES LIKE ‘%innodb_buffer_pool%‘;#查看是否配置了innodb_buffer_pool
#查看bp的设置
  SHOW STATUS LIKE ‘%Innodb_buffer_pool%‘;
查询Innodb_buffer_pool当前使用情况:
  innodb_buffer_pool_bytes_data 已经使用了多少
  innodb_buffer_pool_read_requests 总共查询bp的次数
  innodb_buffer_pool_reads 从物理磁盘中获取到数据的次数

5、MySql复制

偶发性延时的话,控制写入速度:

  主:只负责写数据  

  从:只负责读数据

频发性延时:

  拆分数据库实现多点写入

  把数据分散到不同的数据库上

6、慢查询

SHOW VARIABLES LIKE ‘%query%‘;#查询慢查询日志是否开启
set global slow_query_log=on;#开启慢查询日志
set global long_query_time=1;#设置记录查询超过多长时间的sql
set global slow_query_log_file=‘/opt/data/slow_query.log‘;#设置mysql慢查询日志路径,此路径需要有写权限
mysqldumpslow(可以解析日志中查询速度慢的sql语句)命令参数如下:
-s,是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙;
-t,是top n的意思,即为返回前面多少条的数据;
-g,后边可以写一个正则匹配模式,大小写不敏感的
例子:#比如说要按照sql执行时间最长的前20条sql
mysqldumpslow -s t -t 20 -g ‘select‘ /opt/data/slowquery_2016050921.log
通过慢查询日志,就可以找到执行效率不高的sql

7、explain/desc

该命令是查看查询优化器如何决定执行查询的主要方法

简单说明:

①id:如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行;

②select_type有3中值:

simple 它表示简单的select,没有union和子查询.
primary 最外面的select,在有子查询的语句中,最外面的select查询就是primary
DERIVED 值表示包含在FROM字句的子查询中的SELECT,MySQL会递归执行并将结果放到一个临时表中。服务器内部称其“派生表”,因为该临时表是从子查询中派生来的

③type列:指MySQL的访问类型,也就是如何查找表中的记录,下面是最重要的访问方法,依次从最差到最优:

all<index<range<ref<eq_ref<const,system<null

Explain能做什么?

查看sql的执行效率,帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们的查询。

 

8、索引

普通索引:所有列都可以添加索引
  create index ‘my_index‘ on bkl(name);
  alter table blk add index my_index2 (sex);
#上面这两种方式都是添加普通索引

alter table blk add index my_index3 (sex,name);#添加组合索引

alter table blk add unique index my_index4 (phone);#添加唯一索引
create unique index ‘my_index5‘ on bkl(phone);
#添加唯一索引

添加主键索引:
  alter table blk modify id int primary key;
删除索引:
  alter table blk drop index my_index2;

唯一索引:unique
主键索引:primary ky
组合索引、多列索引

索引的优化:

①最适合索引的列是出现在WHERE 子句中的列,或连接子句中指定的列
②对于惟一值的列,索引的效果最好,而具有多个重复值的列,其索引效果最差
③不要过度索引,根据业务需要、系统模块实现来使用索引

9、锁

MyISAM存储引擎,其锁是表锁。并发情况下的读没有问题,但是并发写入性能比较差。

InnoDB存储引擎是通过对索引上的索引项加锁来实现行锁。这种特点也就意味着,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

查看死锁:

  show processlist;

  show engine innodb status;#一般日志里有dblock、lock等字样

引发死锁的原因一般是多少线程并发,lock的对象仅在对应表sql commit或者rollback后释放

可以根据MySQL的加锁规则,定位出线上产生死锁的原因

关闭自动提交:
  set @@autocommit=0;

查看自动提交是否关闭:

  select @@autocommit;

10、事务

事务是访问并可能更新数据库中各种数据项的一个程序执行单元。事事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
事务的四个特性:
  原子性(atomicity)
  一致性(consistency)
  隔离性(isolation)
  持久性(durability)

11、SQL的优化

目标:减少IO次数,降低CPU计算

①尽量减少查询的模糊匹配

②不要在建立的索引的数据列上进行下列操作

  避免对索引字段进行计算操作
  避免在索引字段上使用not,<>,!=
  避免在索引列上使用IS NULL和IS NOT NULL
  避免在索引列上出现数据类型转换
  避免在索引字段上使用函数
  避免建立索引的列中使用空值。

③尽量减少排序

  通过利用索引来排序的方式进行优化
  减少参与排序的记录条数
  非必要不对数据进行排序

③尽量避免select *

  Select * 一般都会造成全表扫描,显示所有列,select 需要的字段即可

④尽量用 join 代替子查询

⑤尽量用 union all 代替 union

⑥避免类型转换

⑦避免在WHERE子句中使用in,not  in,or 或者having

12、监控工具

Spotlight on mysql:可以监控到mysql的io、qcache、连接数、buffer pool等等,还有预警的功能
Lepus:一个开源的国产监控平台,可以监控到mysql的慢查询、 qcache、连接数、buffer pool等等,可以同时监控多台
Zabbix:也是一个开源的监控平台,和lepus类似,配置比较复杂

时间: 2024-08-21 13:19:48

MySql:监控及优化的相关文章

Mysql监控及优化

一.Mysql连接数 1.配置Mysql连接数: vim /etc/my.cnf [mysqld]下面修改 max_connections=1000 不写默认为100. wait_timeout=60 设置超时时间 2.查看当前连接数: show status like '%Threads_connected%'; show processlist;  二.Mysql缓存 1.开启缓存: vim /etc/my.cnf mysqld下面添加或修改 query_cache_type=on #开启缓

性能测试之mysql监控、优化

我们在做性能测试的目的是什么,就是要测出一个系统的瓶颈在哪里,到底是哪里影响了我们系统的性能,找到问题,然后解决它.当然一个系统由很多东西一起组合到一起,应用程序.数据库.服务器.中中间件等等很多东西.那我们测试的时候上面这些东西里面任何一个环节都可能会出问题,都可能会影响我们系统的性能.这篇博客主要讲下mysql数据库咱们在做性能测试的时候应该监控什么东西,又有哪些需要优化的地方. 一.哪些东西会影响mysql的性能? 1.硬件 2.系统配置 3.数据库表结构 4.SQL以及索引 硬件 硬件就

京东MySQL监控之Zabbix优化、自动化

随着京东业务的飞速发展, MySQL数据库的使用更加普及.服务器量级飞速增长,这对京东MySQL DBA团队的要求也越来越高.监控系统为数据库管理和维护提供了精确的数据依据,是数据库运维人员的千里眼和顺风耳. 准确.及时.有效的监控,能够使运维人员对生产服务系统运行情况了如指掌.通过分析获得的监控信息,判断被监控数据库的运行状态,对可能出现的问题进行预测,可以及时制定出适当的优化方案,从而保证整个系统正常.高效地运行.这也就在很大程度上保证了数据库的安全性,避免了一些不必要的损失.所以,我们有必

MySql监控优化

MySQL监控 MySQL服务器硬件和OS(操作系统)调优: 1.有足够的物理内存,能将整个InnoDB文件加载到内存里 —— 如果访问的文件在内存里,而不是在磁盘上,InnoDB会快很多. 2.全力避免 Swap 操作 — 交换(swapping)是从磁盘读取数据,所以会很慢. 3.使用电池供电的RAM(Battery-Backed RAM). 4.使用一个高级磁盘阵列 — 最好是 RAID10 或者更高. 5.避免使用RAID5 — 和校验需要确保完整性,开销很高. 6.将你的操作系统和数据

架构设计:系统存储(8)——MySQL数据库性能优化(4)

================================ (接上文<架构设计:系统存储(7)--MySQL数据库性能优化(3)>) 4-3.InnoDB中的锁 虽然锁机制是InnoDB引擎中为了保证事务性而自然存在的,在索引.表结构.配置参数一定的前提下,InnoDB引擎加锁过程是一样的,所以理论上来说也就不存在"锁机制能够提升性能"这样的说法.但如果技术人员不理解InnoDB中的锁机制或者混乱.错误的索引定义和同样混乱的SQL写操作语句共同作用,那么导致死锁出现的

MySQL监控、性能分析——工具篇

MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析.监控预警.容量扩展议题越来越多.“工欲善其 事,必先利其器”,那么我们如何在进行MySQL性能分析.监控预警.容量扩展问题上得到更好的解决方案,就要利用各种工具来对MySQL各种指标进行分 析.本文是读书笔记,下面提及的工具,读者可能都用过,或打算准备是使用.MySQL服务器的发布包没有包含那些能完成许多常见任务的工具,例如监控服务器的工具.比较服务器间数据的工具.我们把这些工具分成以下几类:界面.监

Mysql线程池优化笔记

Mysql线程池优化我是总结了一个站长的3篇文章了,这里我整理到一起来本文章就分为三个优化段了,下面一起来看看. Mysql线程池系列一(Thread pool FAQ) 首先介绍什么是mysql thread pool,干什么用的?使用线程池主要可以达到以下两个目的:1.在大并发的时候,性能不会因为过载而迅速下降.2.减少性能抖动 thread pool的工作原理?线程池使用分而治之的方法来限制和平衡并发性.与默认的thread_handling不同,线程池将连接和线程划分开,所以连接数量和执

mysql的配置优化

需求:mysql的参数优化对于不同的网站,极其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有关系,优化不可能一次万次,需要在工作当中不断的监控观察和调试,才能得到最佳的效果.性能优化影响最大的变量分为连接请求变量和缓冲区变量. 理论总结: 修改vim/my.cnf max_connections = 1024    设置最大连接数为1024 back_log = 100      暂存的连接数量 wait_timeout = 100 interactive_timeout = 100

第23章 mysql 监控

2015-10-25 目录 参考资料 [1] 唐汉明.深入浅出MySQL 数据库开发.优化与管理维护(第2版)[M].北京:人民邮电出版社,2014 [2] Schwartz.高性能MySQL(第3版)[M].北京:电子工业出版社,2013 [3] mysql常用监控脚本命令整理 [4] MySQL监控应该知道的九件事 [5] MySQL Enterprise Monitor [6] ZABBIX监控MYSQL [7] MySQL InnoDB监控 [8] mysql性能监控指标 [9] MyS

MySQL 调优/优化的 100 个建议

MySQL 调优/优化的 100 个建议 提交 我的评论 加载中 已评论 MySQL 调优/优化的 100 个建议 2015-07-08 数据库开发 数据库开发 数据库开发 微信号 DBDevs 功能介绍 分享数据库相关技术文章.教程和工具,另外还包括数据库相关的工作.偶尔也谈谈程序员人生 :) (点击上方蓝字,快速关注我们) (编注:本文写于 2011 年) MySQL是一个强大的开源数据库.随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈.这里提供 101 条优化 MySQL 的建议