1、Mysql连接数

  Mysql默认最大连接数为100。
  设置Mysql的最大连接数,在Mysql的配置文件中增加:
  max_connections = 1000                #Mysql的最大连接数,默认如果不写的话是100个
  wait_timeout = 10                        #超时时间
  配置文件路径:
   (/etc/my.cnf    系统自带)                (/opt/lampp/etc/my.cnf    安装Mysql 路径)
  查看当前有多少个连接
  show status like '%Threads_connected%';             #查看当前连接数
  show processlist;                               #也可查看锁表
2、Mysql缓存
  Query Cache缓存的是sql语句对应的结果集,InnoDB_Buffer_Pool中缓存的是表中的数据。Buffer_Pool是设置的越大越好,一般设置为服务器物理内存的70%。
  缓存1(MySQL层):查询缓存 Query Cache
    ①.查询表里的数据有变化,之前的缓存失效。
    ②.查询语句必须一模一样,才能用查询缓存;只要字符大小写或者注释等有一点点不同,都不可以用查询缓存。
    ③.任何一个包含不确定的函数(比如now(),current_date())的查询不会被缓存。
  开启Query Cache(查询缓存参数,在Mysql配置文件中添加,linux下为my.cnf配置文件的[mysqld]模块下,windows下为my.ini):
    query_cache_type = ON            #是否开启查询缓存,具体选项是OFF,ON
    query_cache_size = 200M           #分配给查询缓存的总内存,一般建议不超过256M
    query_cache_limit = 1M              #限制MySQL存储的最大结果。如果查询的结果比这个大,那么就不会被缓存。
  查询状态:
    SHOW VARIABLES LIKE '%query_cache%';  #查询qcache状态
  命令参数列表:
    have_query_cache               #该MySQL 是否支持Query Cache;
    query_cache_limit                #缓存块大小,超过该大小不会被缓存
    query_cache_min_res_unit                   #每个qcache最小的缓存空间大小
    query_cache_size                           #分配给查询缓存的总内存
    query_cache_type                          #是否开启
    query_cache_wlock_invalidate                 #控制当有锁加在表上的时候,是否先让该表相关的 Query Cache失效
  使用状态监控:
    SHOW STATUS LIKE 'Qcache%';               #查询qcache当前使用情况

  命令参数列表:
    Qcache_free_blocks                          #内存碎片;Query Cache中目前还有多少剩余的blocks。
    如果该值显示较大,则说明Query Cache 中的内存碎片较多了,可能需要寻找合适的机会进行整理。
    如果这个值非常大,可以使用FLUSH QUERY CACHE;语句来清理查询缓存碎片以提高内存使用性能。该语句不从缓存中移出任何查询。
    Qcache_free_memory                         #Query Cache 中目前剩余的内存大小
    Qcache_hits                                 #缓存命中次数
    Qcache_inserts                              #多少次未命中然后插入
    Query Cache 命中率= Qcache_hits / ( Qcache_hits + Qcache_inserts );
  开启profile(通过设置profile参数来启用SQL剖析):
    set @@profiling=1;                        #设置profile开启(1为开启,0为关闭)
    select @@profiling;                        #查看profile是否开启
    show profiles;                             #查看所有的profile
    show profile for query id;                    #查看指定的sql语句 
      根据业务特征权衡是否需要开启查询缓存。如果读的操作较多,才开启查询缓存。
  缓存2(存储引擎层):InnoDB_Buffer_Pool

    InnoDB        支持外键、支持事务,是行级锁,有自带的缓存池InnoDB_Buffer_Pool。
    MyISAM    不支持事务、不支持外键,是表锁。
    热数据:经常用的数据。
  开启InnoDB_Buffer_Pool(    InnoDB_Buffer_Pool参数,在Mysql配置文件中添加,linux下为my.cnf配置文件的[mysqld]模块下,windows下为my.ini):    
    innodb_buffer_pool_size = 20M                     #设置Innodb_buffer_pool的大小
    innodb_buffer_pool_dump_now = ON                #默认为关闭OFF。开启时,停止MySQL服务,InnoDB将InnoDB缓冲池中的热数据保存到本地硬盘。
    innodb_buffer_pool_load_at_startup = ON       #默认为关闭OFF。开启时,启动MySQL服务,MySQL将本地热数据加载到InnoDB缓冲池中。
  查询状态:
    SHOW VARIABLES LIKE '%innodb_buffer_pool%';    #查询InnoDB_Buffer_Pool状态
  使用状态监控:
    SHOW STATUS LIKE '%Innodb_buffer_pool%';     #查询Innodb_buffer_pool当前使用情况
  命令参数列表:
    Innodb_buffer_pool_bytes_data            #已经使用了多少
    innodb_buffer_pool_read_requests           #总共查询bp的次数
    innodb_buffer_pool_reads                 #从物理磁盘中获取到数据的次数
3、Mysql sql语句的生命周期
  1).Mysql服务器监听端口3306
  2).验证访问用户
  3).创建Mysql线程
  4).检查内存(Ocache)
  5).解析sql
  6).生成查询计划
  7).打开表
  8).检查内存(Buffer Pool)
  9).到磁盘取数据
  10).写入内存
  11).返回数据给客户端
  12).关闭表
  13).关闭线程
  14).关闭连接
4、索引
  普通索引:最基本的索引,它没有任何限制,所有的列都可以添加索引。
    create index 索引名称 on 表名(列);                  #添加普通索引
    alter table 表名 add index 索引名称 (列);               #添加普通索引
  唯一索引:比普通索引效率要高,unique;与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)
    create unique index 索引名称 on 表名(列名);                  #添加唯一索引
    alter table 表名 add unique index 索引名称 (列);                #添加唯一索引
  主键索引:主键就是索引primary key
    alter table 表名 add primary key (列);                        #添加主键索引
  组合索引、多列索引:where后面常用的值,可以添加多列索引。
    alter table 表名 add index 索引名称 (列1,列2);                 #添加组合索引
  删除索引:
    drop index 索引名 on 表名 ;                                  #删除索引
    alter table 表名 drop index 索引名;                            #删除索引
  意义:索引在数据库中的作用相当于目录在书籍中的作用类似,都用来提高查找信息的速度。索引是一个表中所包含值的列表,其中注明了表中包含各个值的行所在的存储位置,使用索引查找数据时,先从索引对象中获得相关列的存储位置,然后再直接去其存储位置查找所需信息,这样就无需对这个表进行扫描,从而可以快速的找到所需数据。
  作用:通过唯一性索引,确保数据的唯一性;加快数据的检索速度;加快表之间的连接;减少分组和排序时间;使用优化隐藏器提高系统性能;减少计算机工作量,大大提高查询效率。
5、慢查询:记录查询慢的sql语句(自己设定查询响应时间)
  开启慢查询:
  A方法:需要重启Mysql服务
  Linux:在Mysql配置文件my.cnf中增加
    log-slow-queries=/opt/data/slowquery.log (指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log)
    long_query_time=2 (记录超过的时间,默认为10s)
    log-queries-not-using-indexes (log下来没有使用索引的query,可以根据情况决定是否开启)
  Windows:在my.ini的[mysqld]添加如下语句:
    log-slow-queries = E:\web\mysql\log\mysqlslowquery.log
    long_query_time = 2(其他参数如上)
  B方法:不用重启Mysql服务
    set global slow_query_log=on;                              #开启慢查询日志        
    set global long_query_time=1;                              #设置记录查询超过多长时间的sql
    slow_query_log_file='/opt/data/slow_query.log';                #设置mysql慢查询日志路径,日志文件必须存在,必须有写权限 (可以不执行,默认生成)
  查询状态:
    SHOW VARIABLES LIKE '%query%';                           #查询当前mysql慢查询是否开启,以及mysql的慢查询日志文件在哪。
  命令参数列表:
    slow_query_log                                            #是否开启慢查询
    slow_query_log_file                                        #日志的存放位置
    long_query_time                                            #超过多少秒的查询就写入日志

  使用mysqldumpslow命令可以解析mysql慢查询日志。
  Mysqldumpslow命令参数如下:
    -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
    按照时间排序的前10条里面含有左连接的查询语句:mysqldumpslow -s t -t 10 -g 'left join'/opt/data/slowquery_2016050921.log
6、sql语句怎么优化
  目的:①.减少IO次数;②.降低CPU计算
  方法:
    ①.改变 SQL 执行计划
    ②.明确了优化目标之后,我们需要确定达到我们目标的方法。对于 SQL 语句来说,达到上述2个目标的方法其实只有一个,那就是改变 SQL 的执行计划,让他尽量“少走弯路”,尽量通过各种“捷径”来找到我们需要的数据,以达到 “减少 IO 次数” 和 “降低 CPU 计算” 的目标。
  SQL优化实例-业务逻辑上优化:
    优化要从整个业务逻辑上进行。针对数据库问题进行的优化,首先要考虑不查或少查数据库。
    如果查询不可避免,可以考虑两种优化方式:
    1.避免磁盘IO,也就是让查询在内存中完成。
    2.通过sql和索引的调整,让MySQL用更高效率的方式查询。
  SQL优化实例-索引设计原则:
    搜索的索引列,不一定是所要选择的列,换句话说,最适合索引的列是出现在WHERE 子句中的列,或连接子句中指定的列,而不是出现在SELECT 关键字后的选择列表中的列。
    使用唯一索引,考虑某列中值的分布。对于惟一值的列,索引的效果最好,而具有多个重复值的列,其索引效果最差。
    使用短索引。如果对串列进行索引,应该指定一个前缀长度,只要有可能就应该这样做。例如,如果有一个CHAR(200) 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。对前10 个或20 个字符进行索引能够节省大量索引空间,也可能会使查询更快。
    利用最左前缀。在创建一个n 列的索引时,实际是创建了MySQL可利用的n 个索引。多列索引可起几个索引的作用,因为可利用索引中最左边的列集来匹配行。这样的列集称为最左前缀。
    不要过度索引。不要以为索引“越多越好”,什么东西都用索引是错的。每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能,这一点我们前面已经介绍 过。在修改表的内容时,索引必须进行更新,有时可能需要重构,因此,索引越多,所花的时间越长。如果有一个索引很少利用或从不使用,那么会不必要地减缓表 的修改速度。此外,MySQL在生成一个执行计划时,要考虑各个索引,这也要费时间。创建多余的索引给查询优化带来了更多的工作。索引太多,也可能会使 MySQL选择不到所要使用的最好索引。只保持所需的索引有利于查询优化。如果想给已索引的表增加索引,应该考虑所要增加的索引是否是现有多列索引的最左 索引。如果是,则就不要费力去增加这个索引了,因为已经有了。

  explain 的type列,最差到最优
  all<index<range<ref<eq_ref<const,system<null
 
7、锁(如果修改数据的时候,条件是索引列就是行级锁;如果条件不是索引列,则是行级锁。)
  lock的对象是事务,用来锁定的是数据库中的对象,如表、行。并且一般lock的对象仅在事务commit或者rollback后释放。(设置不自动提交)
  特点:InnoDB是通过对索引上的索引项加锁来实现行锁。这种特点也就意味着,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。
    show processlist;                                   #查看是否死锁
    show engine innodb status;                            #查看是否死锁,一般日志里有dblock、lock等字样
    SELECT * FROM information_schema.INNODB_TRX;          #定位哪个线程导致死锁

8、读写分离:
  主:只负责写数据
  从:只负责读数据
  偶发性延时的话:控制写入速度;
  频发性延时的话:差分数据库实现多点写入,把数据分散到不同数据库上。
9、自动提交
  select @@autocommit;                                  #查看自动提交是否开启,0为关闭、1为开启
  set @@autocommit = 0;                       #设置自动提交关闭,这种方式只对当前session有效
  autocommit = 0;                                  #重启后永久生效(在my.cnf配置文件的[mysqld]模块下配置)

【声明:转载自博客地址:http://www.cnblogs.com/suansuan/】

mysql 监控及优化——转载自http://www.cnblogs.com/suansuan/的更多相关文章

  1. Mysql监控及优化

    一.Mysql连接数 1.配置Mysql连接数: vim /etc/my.cnf [mysqld]下面修改 max_connections=1000 不写默认为100. wait_timeout=60 ...

  2. Mysql监控、优化

    一.查询语句的生命周期 1.MYSQL服务器监听3306端口 2.验证访问用户 3.创建MySQL线程 4.检查内存(Qcache),当查询命中缓存,MYSQL立刻返回结果,跳过解析.优化.执行阶段. ...

  3. 性能测试之mysql监控、优化

    我们在做性能测试的目的是什么,就是要测出一个系统的瓶颈在哪里,到底是哪里影响了我们系统的性能,找到问题,然后解决它.当然一个系统由很多东西一起组合到一起,应用程序.数据库.服务器.中中间件等等很多东西 ...

  4. mysql监控和优化(2)

    mysql主从复制 3个线程完成复制:主库1个线程负责记录数据库变更日志从库1个线程负责拉取主库的变更日志从库1个线程负责执行主库的变更日志实现了获取事件和重放事件的解耦,允许异步进行.复制的瓶颈:主 ...

  5. 数据库Mysql监控及优化

    在做 性能测试的时候数据最重要,数据来源于哪里呢,当然是数据库了,数据库中,我们可以知道,数据从磁盘中要比从缓存中读取数据的时间要慢的多的多,还可以知道,同样的一个sql语句,执行的效率也不一样,这是 ...

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

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wangwei007.blog.51cto.com/68019/1833332 随 ...

  7. MySql监控优化

    MySQL监控   MySQL服务器硬件和OS(操作系统)调优:   1.有足够的物理内存,能将整个InnoDB文件加载到内存里 —— 如果访问的文件在内存里,而不是在磁盘上,InnoDB会快很多. ...

  8. MySQL监控、性能分析——工具篇(转载)

    MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析.监控预警.容量扩展议题越来越多.“工欲善其事,必先利其器”,那么我们如何在进行MySQL性能分析.监控预 ...

  9. MySQL数据库性能优化与监控实战(阶段四)

    MySQL数据库性能优化与监控实战(阶段四) 作者 刘畅 时间 2020-10-20 目录 1 sys数据库 1 2 系统变量 1 3 性能优化 1 3.1 硬件层 1 3.2 系统层 1 3.3 软 ...

随机推荐

  1. SVM-SVR

    高频率的接触到了SVM模型,而且还有使用SVM模型做回归的情况,即SVR.另外考虑到自己从第一次知道这个模型到现在也差不多两年时间了,从最开始的腾云驾雾到现在有了一点直观的认识,花费了不少时间.因此在 ...

  2. .Net中Task使用来提高代码执行效率

    技术不断更新迭代,更高效的执行效率越来越被重视,所以对Task的使用进行了简单使用做了整理与大家分享. .Net 中有了Task后使多线程编程更简单使用和操作,下面粘上代码进行简单说明: /// &l ...

  3. 初识 flex 布局

    开启弹性盒模式:   display:flex / inline-flex:   inline-flex  行内弹性盒 1.设置 flex 缩放的 限定值 min-width 最小值   min-wi ...

  4. (Struts2学习系列三)Struts2动态方法调用:通配符方式

    更改src/struts2.xml的代码: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...

  5. Linux批量解压缩脚本

    #!/bin/bash # 批量解压缩脚本 # 作者: shaohsiung # 时间: // # Store all file names in the tmp directory with the ...

  6. leetcood学习笔记-235-二叉搜索树的最近公共祖先

    题目描述: 利用二叉搜索树的特点,如果p.q的值都小于root,说明p q 肯定在root的左子树中:如果p q都大于root,说明肯定在root的右子树中,如果一个在左一个在右 则说明此时的root ...

  7. 【归档】Mysql大表归档

    作为一个企业或者DBA,我们通常会有这种想法,数据是一个公司的核心命脉,应该需要永久保存,很多时候DBA和开发沟通的时候,开发人员也会这么告诉我们,这份数据非常重要,数据需要永久保存.然而,如果将数据 ...

  8. JavaScript中的函数柯里化与反柯里化

    一.柯里化定义 在计算机科学中,柯里化是把 接受多个参数的函数 变换成 接受一个单一参数(最初函数的第一个参数)的函数 并且返回 接受余下参数且返回结果的新函数的技术 高阶函数 高阶函数是实现柯里化的 ...

  9. LUOGU P3690 【模板】Link Cut Tree (lct)

    传送门 解题思路 \(lct\)就是基于实链剖分,用\(splay\)来维护每一条实链,\(lct\)的维护对象是一棵森林.\(lct\)支持很多神奇的操作: \(1.\) \(access\):这是 ...

  10. hdu多校第八场 1009 (hdu6665) Calabash and Landlord 计算几何/dfs

    题意: 给定两个矩形,输出这两个矩形把平面分成了多少块. 题解: 本来是道计算几何的大讨论,被我生生写成了bfs. 离散化边,注意不重合的边中间要空出来一格,四周也要空出来一圈,然后暴力bfs计算一共 ...