mysql进阶

mysql高级
1.存储引擎
  1.mysql体系结构

 

  2.存储引擎简介

    a.存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以被称为表类型

  3.存储引擎的特点

    a.InnoDB:是一种兼顾高可靠性能的通用存储引擎,在mysql5.5之后就是mysql的默认存储引擎

    b.InnoDB的特点:

      - DML(curd)操作遵循ACID模型,支持事务。

      - 行级锁,提高并发访问效率

      - 支持外键foreign key 外键约束,保证数据的完整性和正确性。

      - 文件:xxx.ibd xxx代表表名,innoDB引擎的每张表都对应一个表空间文件,存储该表的表结构,数据,索引

      - 逻辑存储结构如下

    c.MyISAM:是mysql早期默认存储引擎

      特点: - 不支持事务,不支持外键

          - 支持表锁,不支持行锁

          - 访问速度快

    文件 xxx.sdi :存储表结构信息

      xxx.MYD :存储数据

      xxx.MYI :存储索引

    d. Memory:Memory 引擎表数据存储在内存中,只能作为临时表或者缓存使用。

       特点:  - 内存存放

          - hash索引(默认)

      文件 xxx.sdi:存储表结构信息

    e.三张表的比较

    f . 存储引擎的选择

      - InnoDB:是mysql的默认存储引擎,支持事务,外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了查询和插入外,还有很多的更新,删除操作,那么InnoDB就是比较适合的选择

      - MyISAM:如果应用是以读取和插入为主的,只有少量的更新和删除操作,并且对事务的完整性,并发性要求不是很高,那么这个选择MyISAM就很合适。

      - MEMORY: 将所有数据保存在内存中,访问速度快,通常用于临时表的以及缓存。MEMORY的缺点就是表不能太大,太大的表不能缓存在内存里,而且数据的安全性无法保障。

 

2.索引

  1.索引概述:索引是帮助mysql 高效获取数据的数据结构,他是有序的
     a.索引的优点:提高数据检索效率,降低数据库IO成本;通过索引对数据进行排序,降低了数据排序的成本,降低CPU的消耗。
     b.索引的缺点:索引也是需要占用空间的(可以忽略);降低了表的更新速度,增删改速度降低。
  2.索引结构:
    a.B+Tree索引:常见的索引类型,大部分引擎都支持B+树索引
    b.Hash索引:底层结构使用Hash表实现的,只有精确匹配到索引列的查询才有效,不支持范围查询
    c.R-Tree索引:又叫空间索引,是MyISAM的一个特殊索引类型,主要用于地理空间数据类型,使用场景较少
    d. Full-text索引: 全文索引,是一种通过建立倒排索引,快速匹配文档的方式。
    二叉树的缺点:顺序插入时,会形成一个链表,查询效率大大降低,大数据的情况下,层级较深,减速速度慢
    解决方法:红黑树-自平衡,但是无法解决大数据情况下,层级深的问题
    解决方案:B-Tree(多路平衡查找数),以一颗最大度数为5的b-tree为例,每个结点最多存储4个结点,5个指针:

 

    B+Tree:以一颗最大度数为4阶的B+Tree为例

 

    B+Tree的特点:
      a.所有的数据结点都会出现在叶子结点
      c.叶子结点形成一条单向链表
    注意:Mysql索引数据结构对经典的B+Tree进行了优化。在原来B+Tree的基础上,增加了一个指向相邻叶子结点的指针,就形成了带有顺序指针的B+Tree,提高区间的访问性能。

 

     Hash索引:

    哈希索引就是采用一定的Hash算法,将键值换算成新的Hash值,映射到对应的槽位上,然后存储在Hash表。如果两个以上的键值映射到相同的槽位上,就会产生Hash冲突,也称为Hash碰撞,可以通过链表解决。

    Hash索引的特点:

      a. Hash索引只能用于对等比较(=,in) ,不支持范围查询,(<>)

      b .Hash索引无法利用索引进行排序。

      c.查询效率高,通常一次检索就可以(不出现Hash碰撞),效率通常高于B+Tree索引

    存储引擎支持

      在mysql中,支持哈希索引的是Memory引擎,而InnoDB具有自适应hash功能,hash索引是存储引擎根据B+Tree在指定条件下自动构建的。

    面试题:为什么InnoDB选择B+Tree作为索引结构?

    答:相对于二叉树,层级更少,搜索效率高;对于B-Tree ,无论是叶子结点还是非叶子结点,都会保存数据,这样导致一页中存储的键值对减少,指针减少,同样保存大量的数据,只能增加树的高度,导致性能降低;相对于Hash索引,它只支持等值匹配不支持范围匹配,还不支持排序。

  3.索引分类

    1.主键索引:针对表中主键创建的索引 ,自动创建,只能有一个,关键字primary

    2.唯一索引:避免同一个表中数据列的值重复,可以多个,关键字,unique

    3. 常规索引: 快速定位特定数据,可以多个

    4.全文索引: 全文索引查找的是文本的关键字,而不是比较索引中的 值 ,可以多个 ,关键字,fulltext

    5.根据索引的存储形式,又分为下面两种:

      a.聚簇索引:将数据存储与索引放到一块,索引机构的叶子结点存储了行数据,必须有且只有一个

      b.二级索引:将数据与索引分开,索引结构的叶子结点关联的是对应的主键,可以存在多个

    6.聚簇索引的选取规则:

      a. 如果存在主键,主键索引就是聚簇索引

      b.如果不存在主键,那么将使用第一个unique索引作为聚簇索引

      c. 如果不存在主键,或者没有合适的唯一索引,则InnoDB会自动生成一个揉我的作为隐藏的聚簇索引

    面试题:INnoDB主键索引的B+Tree的高度为多少?以及存储的数据量大概是多少?
    答:假设一行数据大小为1k,一页中可以存储16行。InnoDB的指针占用6个字节的空间,主键即使为bigint,占用8个字节。高度为2时,n*8 +(n+1) = 16* 1024 ,算出n约为1170,1171* 16 = 18736,

    高度为3时,则多一层,1171*1171*16 = 21939856 ~ 两千万条数据

  4.索引的操作语法

    1.创建索引:create【unique|fulltext|】index index_name on table_name(col_name1,col_name2...);

    2.查看索引:show index from table_name;

    3.删除索引: drop index index_name  on table_name;

  5.sql性能分析

    a.sql执行频率

    通过如下指令,可以查看当前数据库的Insert,update,delete,select的访问频率:show global status like 'Com_______';

    b.慢查询日志:

    慢查询日志记录了所有执行时间超过指定参数的所有sql语句的日志。mysql默认慢查询日志没有开启,需要在mysql的配置文件中配置一下信息:

    #开启mysql慢查询开关:

    slow_query_log=1

    #设置慢查询的阈值为5秒,超过该值视为慢查询,记录日志。

    long_query_time=5

    配置之后,慢查询日志文件位置:/var/lib/mysql/

    c.profile详情

    执行一些列的sql业务操作,然后通过以下指令查看sql的执行耗时:

    #查看每一条sql的耗时基本情况

    show profiles;

    #查看指定query_id的sql各个阶段的耗时

    show profile for query query_id;

    #查看指定query_id 的CPU使用情况:

    show profile cpu for query query_id;

    d.explain 执行计划

     explain 或者desc 获取mysql如何执行select 语句的信息,包括select语句执行过程中表如何连接和连接的顺序。

    explain执行各个字段的意义:

      a.id: select 查询的序列号,表示查询中执行select字句或者是操作表的顺序,id相同,执行顺序丛上到下,id不同,值越大,越先执行。·

      b.select_type: 表示查询的类型,常见的有simple,简单查询,primary主查询,union union中第二或者之后的查询,subquery 子查询等

      c. type: 表示连接的类型,性能由好到坏的连接类型为null,system.const,eq_ref,ref,range,index,all

      d. possible_key: 可能用到的索引,一个或多个。

      e.key :实际用到的索引

      f.key_length:索引使用的长度,该值表示索引字段最大的可能长度,并非实际使用长度,在不损失精度的前提下,长度越短越好。

      g.rows:mysql认为必须要执行查询的行数,预估值并非实际值。

      h.filtered :表示返回结果的行数占读取行数的百分比,filtered的值越大越好。

  6.索引的使用:(索引失效的情况)

    1.最左前缀法则:如果索引了多列,联合索引,要遵循最左前缀法则,即查询从索引的最左列开始,并且不跳过索引中的列。如果跳过了某一列,索引将部分失效,后面的字段索引失效。要求是索引字段必须存在,和位置无关。例:where  a= 1 b =2 and c = 3 ,index_c_b_a 。同样走索引。

    2.范围查询:联合索引中,出现范围查询,(<>) 范围查询右侧的列索引失效。如何解决呢?尽量使用>= 或者<=。

    3.不要在索引列上进行运算操作,索引将失效

    4.字符串类型字段使用时,不加引号,索引将失效

    5.模糊匹配:如果仅仅是尾部模糊匹配,索引不会失效,如果是头部模糊匹配,索引失效。 

    6.or连接的条件:只有or两侧都有索引才会走索引,不然索引都会失效

    7.数据分布影响:如果mysql评估使用索引比全表更慢,则不适用索引。is null (is not null)同理,如果表中某个字段绝大多数都是null,那么is null条件就不会走索引,同理is not null

    8.sql提示:是优化数据库的一个重要手段,就是在sql中加入一些提示来达到优化的目的

    use index: explain select * from t_user use index(idx_user_pro) where profession = '软件工程';

    ignore index: explain  select * from t_user ignore index(idx_user_pro) where profession = '软件工程';

    force index:  explain  select * from t_user force index(idx_user_pro) where profession = '软件工程';

    9.覆盖索引:尽量使用覆盖索引,意思是查询使用了索引,并且需要返回的列,在该索引中已经全部找到,减少select *。

    注意:explain中的Extra中的信息如果出现using index condition 表示使用了索引,但是需要回表查数据,如果出现using where using index 则表示需要的数据都在索引中找到,不需要回表

    10.前缀索引:当字段是字符串时,有时候需要索引很长的字符串,这会让索引变的很大,查询的时候会浪费大量IO,影响查询效率,此时只讲字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高效率。

    - 语法: create index idx_XXXX on table_name(col(n)); n代表长度,可以根据索引的选择性来决定,而选择性是指不重复的索引值。

    10.单列索引和联合索引

    - 单列索引: 一个索引只包含单个列

    - 联合索引: 一个索引包含多个列

    业务场景中:如果存在多个查询条件,考虑针对查询字段建立索引时,建议建立联合索引,而非单个索引,单个索引可能会导致只走前一个索引,后一个失效。从而导致回表。

  7.索引的设计原则

    1.针对数据量大,且查询比较频繁 的表建立索引

    2.针对于常作为查询条件,排序,分组的字段建立索引

    3.尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率也越高

    4.如果是字符串类型的字段,字段的长度越长,可以针对字段的特点,建立前缀索引

    5.尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。

    6.要控制索引的数量,索引并不是多多益善,索引越多,维护索引的代价也越大,会影响增删改的效率。

    7.如果索引不能存储null值,请在创建时候用not null 约束它,当优化器知道每列时候会包含null值时,可以更好的确定那个索引的效率更高

  8.SQ语句的优化

    1.insert 优化

      a.批量插入

      b.手动提交事务

      c.主键顺序插入

    2.主键优化

      a.数据组织方式:在INnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种方式称为索引组织表。

      b.叶分裂:页可以为空,也可以填充一半,也可以填充100%。每个页包含2~n行数据,如果一行数据过多会溢出,根据主键排列。如果主键乱序插入会出现叶分裂现象导致性能下降。

      c.页合并:当删除一行记录时,实际上记录并没有被物理删除,只是记录标记为删除并且它的空间允许被其他记录声明使用。当页中删除的记录达到Merge_Threshold(50%),InnoDB会开始寻找最靠近的页,看看前后是否可以将两个页合并以优化空间使用

      d.主键设计原则:

        - 满足业务需求的情况下,尽量降低主键长度

        - 插入数据时,尽量选择顺序插入,选择使用Auto_increment自增主键

        - 尽量不要使用UUID做主键或者是其他自然主键,如身份证号

        - 业务操作时,避免对主键的修改

    3.order by 优化

      a.Using filesort:通过表的索引或者全表扫描,读取满足的条件的数据行,然后再排序缓冲区sort buffer中完成排序操作,所有不是通过索引值接返回排序结果的排序都叫FileSort排序。

      b. Using index: 通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index, 不需要额外排队,操作效率高、

 

 

 

 

      c.order by优化:

 

        - 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则

 

        - 必须使用覆盖索引,回表的操作会导致排序使用filesort,效率较低

 

        - 多字段排序,一个升序,一个降序,此时需要注意联合索引创建时的规则。

 

        - 如果不可避免的出现filesort,大数据量排序时候,可以适当增加排序缓冲区大小sort_buffer_size(默认256k)

 

    4.group by 优化

 

 

 

 

       - 在分组操作时,可以通过索引来提高效率

      - 分组操作时,索引的使用也满足最左前缀法则

    5.limit 分页查询的优化

    问题:一个常见的场景就是limit 200000000,10,此时需要mysql排序200000000条记录,而仅仅只返回200000000 -200000010的记录,其他的全部丢弃,查询排序代价十分大。

    优化思路:一般分页查询时,通过创建覆盖索引能够比较好的提升性能,可以通过覆盖索引加子查询的方式进行优化。

    例:explain select * from tb_sku t,(select id from _tb_sku order by id limit 200000000,10) a where t.id = a.id

    6.count优化

      a.MyisAM 引擎把一个表的总数据量记录在了磁盘里,因此执行count(*)的时候直接返回这个数,效率高,但是不能包含where条件

      b.InnoDB 执行count(*) 的时候需要把数据一条一条加载出来再累计计数。

      优化思路,自己计数,比如缓存中维护一个key:value ,新增+1,删除-1

    count的几种用法:

      -count(id):InnoDB会遍历整张表,把每一行的主键id值都取出来,返回服务层。服务层拿到主键后,直接按照行进行累加。

      - count(字段): 

        没有not null 约束:InnoDB会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是不是为null,不为null则累加。

        有 not null约束:直接累加。

      - count(1) InnoDB 遍历整张表,但不取值,服务层对返回的每一行,放一个数字1进去,直接进行累加

      - count(*) InnoDB不会把全部字段取出来,而是做了专门优化,不取值,服务层直接进行累加。 

      总结排序效率:count(字段)<count(id)<count(1)<count(*),所以尽量使用count(*)

    7.update优化

      注意:InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁,大大降低并发性能;

  9.锁

    1.介绍:锁是计算机协调多个进程并发访问某一资源的机制,在数据库中,除传统的计算机资源的争用外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的重要因素。从这个角度来说,锁对数据库而言显得尤为重要,也更加复杂。

    2.锁的分类:

      a.全局锁:锁定数据库的所有表

        1.全局锁就是 对整个数据库进行加锁,加锁后整个实例处于只读状态,后续的dml的写语句,DDL语句,已经更新操作的事务提交语句都将会被阻塞。

        2. 典型的应用场景就是做全库的备份,对所有表进行锁定,从而获得一致性的视图,保证数据库的完整性

        3.操作实例:

          - flush tables with read lock;(加全局锁)

          - mysqldump -uroot -p123456 itcast > itcast.sql

          - unlock tables;(释放锁)

      b.表级锁: 每次操作锁住整张表

        1.表级锁,每次操作锁住整张表。锁的力度大,发生锁冲突的概率最高,并发度最低。应用在MYIsAM,InnoDB,BDB等存储引擎中。

        2.表级锁的分类:

          - 表锁

            1.表共享读锁(读锁:read lock)

 

 

            读锁不会阻塞其他客户端的读操作,但是会阻塞写操作。

 

 

            2.表独占写锁(写锁:write lock)

 

 

            写锁既会阻塞其他客户端的读,又会阻塞其他客户端的写。

 

 

            3.加锁:lock tables 表名。。。 read/write

            4.释放锁: unlock tables /客户端断开连接

          - 元数据锁(meta datalock,简称MDL)

            MDL加锁的过程是系统自动控制的,无需显示加锁,在访问任何一张表的时候会自动加上。MDL锁的主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性

            在MYsql5.5中引入了MDL。当对一张表进行CRUD时,加MDL读锁,当对表结构修改时,加MDL写锁

 

 

 

 

          - 意向锁

            为了避免DML在执行的时候,加的行锁和表锁冲突,在INnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

            a.意向共享锁(IS) :由语句select ... lock in share mode添加;与表锁共享锁read兼容,与表锁排它锁write互斥

            b.意向排他锁(IX): 由insert,update,delete, select ... for update添加。与表锁共享锁read,以及排它锁都互斥。意向锁之间不会互斥

      c.行级锁: 每次操作锁住对应的行数据

        1.行级锁,每次操作锁住对应的行数据。锁粒度最小,发生锁冲突概率最低。并发度最高。应用在InnoDB引擎中。

        2.InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对行记录加锁。对于行级锁,主要分为一下三类

          - 行锁(record lock):锁定单个行的数据,防止其他事务对此行进行update和delete,在RC,RR隔离级别下都支持。

            a.共享锁(S) :允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

            b.排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。

 

 

          DML语句的加锁情况

 

 

 

           注意事项:

 

            - 默认情况下,InnoDB在 RR隔离级别运行,InnoDB使用Next-key锁进行搜索和扫描,防止幻读。

 

            - 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化成行锁。

 

            - InnoDB的行锁是针对索引加的锁,不通过索引条件检索数据,那么InnoDB将会对表中的所有数据加锁,此时,行锁就会升级为表锁;

 

 

          - 间隙锁(Gap lock):锁定索引记录间隙,确保索引记录间的间隙不变,防止其他事务在这个间隙进行insert,产生幻读。 在RR隔离级别下都支持。

            a.索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。

            b.索引上的等值匹配(普通索引), 向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁

            c. 索引上范围查询(唯一索引),会访问到不满足条件的第一个值为止

          - 临键锁(Next-key lock):行锁和间隙锁的组合。同时锁住数据和数据前面的间隙,在RR下支持。

10 . InnoDB引擎

  1.逻辑存储结构

      

 

 

 

 

 

 

  2.架构:InnoDB架构分为两个部分,一个为内存区,一个为磁盘结构

 

 

    架构-后台线程

 

      1.Master Thread :核心后台线程,负责调度其他线程,还负责将缓冲池中得数据异步刷新到磁盘,保持数据的一致性,还包括脏页的刷新,合并插入缓存,undo页的回收。

 

      2.IO Thread :在InnoDB引擎中大量使用了AIO来处理IO请求,这样可以极大的提高数据库的性能,而IO THread 主要负责这些IO请求的回调

 

      3.Purge THread: 主要用于回收事务已经提交了的undo log,在事务提交之后,undo log 可能不用了,就用它来回收。

 

      4.Page Cleaner Thread: 协助Master Thread 刷新脏页到磁盘的线程,它可以减轻MasterTHread 的工作压力,减少阻塞

 

    3.事务原理

 

      事务:事务是一组操作的集合,它是不可分割的工作单位,事务会吧所有的操作作为一个整体一起向系统提交或者撤销操作,这些操作要么同时成功,要么同时失败。

 

      事务的特性:ACID

 

        - 原子性: 事务是不可分割的最小操作单元,要么一起成功,要么一起失败

 

        - 一致性:  事务执行后,数据库状态与其它业务规则保持一致。其他特性都是为了给一致性服务的. 例如买东西,张三买李四的东西, 买卖前和买卖后张三和李四的所有钱数之和是保持不变的.

 

        - 隔离性: 事务和事务之间是隔离开的. 一个事务看不到另一个事务正在操作的数据(正在进行中的状态)

 

        - 持久性:  一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制将数据恢复到提交后的状态。

 

      redo log(保持事务的持久性)

 

        - 重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。

 

        - 该日志文件分为两个部分,重做日志缓冲和重做日志文件,前者在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用。

 

      undo log(保持事务的原子性)

 

        - 回滚日志,用于记录数据被修改前的信息,作用有两个,提供回滚和MVCC(多版本并发控制)

 

        - undo log 和 redo log记录的物理日志不一样,他是逻辑日志。可以认为当执行一条delete语句时,undo log中就会对应记录一条insert语句,反之亦然,当update一条记录时,他就记录一条相反的update语句,当执行rollback 时,就可以从undo log中的逻辑记录中读到相应的内容并回滚。

 

        - undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undolog,因为这些日志可能还用于MVCC

 

        - undo log 存储:undo log采用段的方式进行管理和记录,存在在前面说的rollback segment回滚段中,内部包含1024个undo log segment.

 

    4.MVCC

      1.当前读:读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select 。。lock in share mode,select ..for  update,update..,insert,delete都是一种当前读

 

      2.快照读:简单的select就是快照读,快照读读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读

 

        - Read Committed :每次select ,都生成了一个快照读

 

        - Repeatable Read: 开启 事务后第一个select语句才是快照读的地方

 

        - Serializable:快照读会退化成当前读

 

      3.MVCC:(Multi-Version Concurrency Control) :多版本并发控制。指维护一个数据的多个版本,使得读写的操作没有冲突,快照读为mysql实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,依赖于数据库的三个隐式字段,undo log,readView

 

        a.记录中的隐式字段

 

 

 

      4.undo log:

 

        -回滚日志,在insert,update,delete的时候产生的便于回滚数据的日志。

 

        - 当insert的时候,产生的undo log,只在回滚时需要,在事务提交后可以立即删掉

 

        - 当update,delete 的时候,产生的undo log日志不仅在回滚时需要,在快照读的时候也需要,不会被立即删除

 

      5.undo log 版本链  

 

        -不同事务或者相同事务对同一条记录进行修改,会导致该记录的undo log 生成一条记录版本链,链表的头部是最新的额记录,链表尾部是最旧的记录。

      6.readview:是快照读sql执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务未提交的id.readview包含四个核心字段:

 

 

        

 

        - 版本链数据访问规则:

 

          

11.mysql管理

  1.系统数据库:mysql数据库安装完成后,自带了四个数据库,具体作用如下:

 

 

12.mysql-运维

 

  1.日志:

 

    a.错误日志:错误日志是MySQL最重要的日志之一,它记录 了当mysql启动和停止时,以及服务器运行过程中发生任何严重的相关信息,当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。该日志是默认开启的。默认存放位置是/var/log/,默认的日志文件名为mysqld.log。查看日志位置:show variables like '%log_error%';

 

    b.二进制日志:(binlog):二进制日志记录了所有的DDL和DML语句,但不包括数据查询,show等语句。

 

      作用: - 灾难时的数据恢复

 

         - mysql的主从复制

 

         - mysql8版本下,默认二进制日志是开启的,涉及到参数为:show variables like '%bin_log%';

 

      日志格式:mysql服务器提供了多种格式来记录二进制日志,具体格式特点如下:

 

 

 

 

 

      show variables like '%binlog_format%';

 

      日志查看:由于日志是以二进制文件格式存储,所以不能直接读取,需要二进制查看工具mysqlbinlog来查看,具体语法:

 

        - mysqlbinlog [option] logfilename:参数选项 :

 

          -d 指定数据库名,只列出指定数据库的相关操作

 

          -o 忽略日志中前n行命令

 

          -v 将事件 重构为sql语句

 

          - w 将事件重构为sql,并输出注释信息

 

      日志删除:对于业务繁忙的业务系统,每天生成的binlog数据巨大,如果长时间不清理,将会占用大量磁盘空间,可以通过以下几种方式清理:

 

    c.查询日志:查询日志记录了客户端的所有操作语句,而二进制日志不包含查询数据的sql语句。默认情况下查询日志是未开启的。如果要开启,需要设置一下配置:修改mysql配置文件/etc/my.cof文件,添加: general_log=1 general_log_file=mysql_query.log

    d.慢查询日志:慢查询日志记录了所有执行时间超过long_query_time设置值并且扫描记录不小于min_examined_limit的所有的sql语句,默认未开启。long_query_time默认10秒,最小0,精度可达毫秒

    同样修改配置文件:

    # 是否开启慢查询

    show_query_log=1

    # 执行时间参数

    long_query_time=10

    # 记录执行比较慢的管理语句

    log_slow_admin_statements=1

    # 记录执行较慢的未使用索引的语句

    log_queries_not_using_indexs=1

  2.主从复制

    1.概述:主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库数据库服务器,然后再从库数据上对这些日志从新执行,从而使得主库和从库的数据保持同步。mysql支持一台主库同时向多台从库进行复制。从库同时可以作为其他从服务器的主库,实现链状复制

    2.主从复制的优点:

      a.主库出现问题时,可以快速切换到从库提供服务。

      b.实现读写分离,降低主库的访问压力

      c.可以在从库中执行备份,以避免备份期间影响主库服务

    3.主从复制的原理:

      a.第一步:Master主库在日志提交时,会把数据变更记录在二进制日志文件binlog中

      b.第二步:从库读取主库的二进制日志文件binlog,写到从库的中继日志文件Relay.log

      c.第三步: salve 重做中继日志中的事件,将改变反应它自身的数据。

  3.分库分表(略)

  4.读写分离:

    1.介绍:简单来说就是把对数据库的读写操作分开,主数据库提供写操作,从数据库提供读操作,有效的降低了单台数据库的压力。通过mycat即可轻松实现上述功能

    2.配置:myCat控制后台数据库的读写分离和负载均衡由schema.xml和balance属性控制:

 

    balance:负载均衡策略:

      -0 : 不开启读写分离机制

      -1: 全部的readHost与备用的writeHost都参与select语句的负载均衡

      -2 : 所有的读写操作都随机在writehost,readhost上发送

      -3  : 所有的读请求随机发送到writehost对应的readhost上执行,writehost不负担压力

 

    

 

 

 

 

 

 

 

 

 

        

 

 

 

 

 

 

 

 

 

            

 

 


        

 

 

 

 

 

 

 

    

 

 

 

       

 

 
 
 
 
 
 
 
 
 
    

 

posted @ 2023-07-14 09:09  杨阳洋^_^!  阅读(8)  评论(0编辑  收藏  举报