• 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配置文件的位置:

      [root@besttest ~]# 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类似,配置比较复杂

    如欢如殇 授以青春鲜活肢体奔忙 如思如忘 驱以老朽深沉灵魂冥想 始自情热激荡 从未敢终于世事炎凉 无能执手相望 无法去尝试结发同床 无力至心死身僵 一息坚强 ------ 我一直没有放弃,如果你也能看到 修身 修禅
  • 相关阅读:
    【python】新创建一个列表,并向内添加元素 and 列表中查询最大值位置和最小值位置
    【python】python从命令行读入参数
    【开发环境安装笔记 】微软Visual Studio2012中文旗舰版(完美破解版)
    【Python笔记】Python读取word文本操作详解
    【安装---WIN7--cnpm】win7实测安装npm,cnpm
    【安装---WIN7--Vuejs】Vue.js 安装及其环境搭建
    【安装---WIN7--nodejs】win7安装 nodejs,npm
    【安装--达梦】Linux(中科方德服务器版4.0)安装达梦数据库V8
    【安装—ES】ES数据库安装6.6b版本
    【centos系统--安装--异常】server重装系统后,远程登录提示主机密钥验证失败的解决办法
  • 原文地址:https://www.cnblogs.com/lz2lhy/p/6847131.html
Copyright © 2020-2023  润新知