zoukankan      html  css  js  c++  java
  • mysql相关笔记

    mysql面试题

    局部性原理

    取数据会多取一些数据出来放到内存中,通常为一页,一页4kb大小。

    mysql两种存储引擎对比

    innodb数据页结构

    innodb页单位,16kb

    innodb聚集索引

    如果没有定义主键,那么innodb会判断有没有唯一索引,如果存在唯一索引,那么就会把这个唯一索引当作主键,如果连唯一索引都没有,就会自动生成一个字段(row_id),自增ID。

    row_id是一个隐藏列,只有在select语句时才会被查询出来。

    b+树:

    叶子结点:只存数据

    非叶子结点:存主键+指针

    innodb采用的是聚集索引,索引和数据是在同一份文件存储。

    create index idx_t1_bcd on t1(b, c, d);
    

    b,c,d为辅助索引,通过对比各索引上的数据的大小进行排序。

    先比b的大小,b相等再比c,c相等再比d,以此类推。得到排序后的“序号”,和该序号对应的主键索引的值,最后通过回表查询,获取主键索引对应的真实的数据。

    ![](https://borinboy.oss-cn-shanghai.aliyuncs.com/huan/20200718095136.png style="zoom:33%;" /)

    辅助索引,叶子结点存储数据和主键索引的值,再通过回表查询,查询主键索引查找真实的数据

    通过查询辅助索引查出来主键索引的个数占主键索引总数的80%以上,走全表查询

    正常utf8是0到4个字节大小

    mysql utf8是0到3个字节大小,有些字符是不支持的,mysql中的utf8mb4是标准的utf8编码格式

    最左前缀原则

    b,c,d是索引
    1,*,*,走索引,1**肯定比644小
    *,1,*,不走索引,因为无法判断*1*和644哪个大哪个小
    
    # 不走索引
    select b from t1 group by b,c,d
    # 走索引,相当于还是最左前缀原则
    select b from t1 where b=1 group by b,c,d
    

    事务

    ACID

    原子性

    隔离性

    一致性

    完整性

    mysql事务中有autocommit属性

    隐式提交

    update之后,没有commit,再执行create,alter等ddl操作,会隐式的commit
    

    mysql事务保存点

    四种隔离级别:

    • 读未提交:一个事务可以读到其他事务还未提交的数据,脏读(不可重复读)。

      用得不多,不严谨,违背事务的特性。

    • 读已提交:一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据修改并进行提交后,该事务都能查询到最新的值,会出现不可重复读,幻读

      read commit级别,一个事务加了写锁时,其他事务可以对已加锁的事务所查出来的数据做插入操作。

      前一个事务提交数据之后,第二个事务读取到最新的值,前一个事务再次更新数据,第二个事务读取到的值发生改变,好像是出现了幻觉。

    • 可重复读(mysql默认的隔离级别

      一个事务第一次读取过某条记录之后,即使其他事务修改了该记录的值并且提交,该事务之后再读该条记录后,读到的数据依然还是第一次读取的值,而不是每次都读到不同的数据,这就是可重复读,这种隔离级别解决了不可重复读,但是还是会出现幻读

      repeatable read加写锁时,其他事务不能对已查出来的数据进行插入操作。

    • 串行化

      一个事务在修改某些数据的时候,其他事务操作该数据会出现阻塞,必须等修改数据的事务提交之后才能操作。用得很少。

    版本链

    对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(row_id并不是必要的,我们 创建的表中有主键或者非NULL唯一键时都不会包含row_id列):

    • trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列。
    • roll_pointer:每次对某条记录进行改动时,这个隐藏列会存一个指针,可以通过这个指针找到该记 录修改前的信息。(版本,最新的版本会指向之前的一个版本)

    readview

    m_ids:已修改还未提交的事务,会保存其id至m_ids内,

    可重复读是即使其他事务修改并提交了数据,但是m_ids依然保持不变,仍然认为这些是活跃的事务id。

    MVCC(多并发版本控制)

    MVCC(Multi-Version Concurrency Control ,多版本并发控制)指的就是在使用READ COMMITTD、 REPEATABLE READ这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程。可以使不同 事务的读-写、写-读操作并发执行,从而提升系统性能。READ COMMITTD、REPEATABLE READ这两个隔离级 别的一个很大不同就是:生成ReadView的时机不同,READ COMMITTD在每一次进行普通SELECT操作前都会 生成一个ReadView,而REPEATABLE READ只在第一次进行普通SELECT操作前生成一个ReadView,之后的查 询操作都重复使用这个ReadView就好了

    间隙加锁

    repeatable read加写锁时,其他事务不能对已查出来的相关数据进行插入操作。

  • 相关阅读:
    close 不弹出对话框
    ASP.NET会话(Session)保存模式
    ASP.NET页面刷新后滚动条保留在刷新前的位置 MaintainScrollPositionOnPostback
    CSS实现垂直居中的5种方法
    ExpandStackTrace
    HttpTunnel
    PropertyAccess类 Linq.Expressions 实现
    DatagramResolver
    AsyncUdpClient 类
    C# LockFreeStack类
  • 原文地址:https://www.cnblogs.com/liuhuan086/p/13336704.html
Copyright © 2011-2022 走看看