1.b树和b+树的区别是什么
b+树是b树的升级版,b树非叶子节点和叶子节点都会存储数据,而b+树只有叶子节点才会存储数据,而且叶子节点存储的数据都是双向指针指向的,是有顺序的,一般树的高度在2到4层,树的高度直接影响I/O读写速度,3层树结构能存20G数据,4层可以存储几十T数据,存储单位为页,一页存储16kb数据,每读取一页数据为16kb
2.什么是最左前缀原则
最左前缀原则是在复合索引中是否走索引的一个名词叫法,有一个复合索引,abc,查询,a,ab,abc都会走索引,但是查询b,c,bc都不会走索引,因为索引是有顺序的
3.Mysql数据库事物的四大特性ACID靠什么保证的
A:原子性,由undo log日志保存,它记录了需要回滚的日志信息,事物回滚时撤销已经执行成功的sql I:隔离性,由MVCC来保证 D:持久性,由内存和redo log来保证,mysql修改数据同时在内存和re do log记录这次操作,宕机时可以从redo log恢复数据 C:一致性,由原子性,隔离性,持久性共同保证数据的一致性 innodb存储引擎记录两个日志,undo log和redo log,mysql服务层面记录binlog日志用来进行数据库主从复制 . 隔离性有四个隔离级别 · read uncommon 读未提交,可能会读到其他事务未提交的数据,也叫脏读 · read commit 读已提交,两次读取结果不一致,叫做不可重复读,不可重复读解决了脏读问题,只会读取已提交的事务,但是会出现一个事物里两次读取结果不一样的问题 · repeatable read 可重复读,这是mysql默认级别,就是每次读取结果都一样,但是有可能产生幻读 · serializable串行,一般不会使用,他会给每一行的数据加锁,会导致大量超时和锁竞争的问题
4.Mysql执行计划explain结果中各个字段的含义是什么
一共有12个结果字段 id: 查询语句中出现每个select关键字,Mysql就会为他分配一个唯一ID,某些子查询会被优化为join查询,那么出现的id一样 select_type: select关键字对应的那个查询字段的类型 table: 表名 partitions: 匹配的分区信息 type: 针对单表的查询方式,时使用索引还是全表扫描 possible_keys: 可能用到的索引,一个表中可以有多个索引,看走哪一个索引 key: 实际上使用的索引名称 key_len: 实际上使用到的索引长度 ref: 当使用索引列等值查询的时候,与索引列进行等值匹配的对象信息 rows: 预估的需要读取的记录条数 filtered: 某个表经过搜索条件过滤后剩余记录条数的百分比 extra: 一些额外信息,比如排序等
5.innodb是如何实现事务的
innodb通过buffer pool, log buffer, redo log, undo log来实现事务的,以一个update语句为例 · innodb在收到一个update语句后,会先根据条件找到数据所在页,并将该页缓存在buffer pool中 · 执行update语句,修改buffer pool中的数据(修改内存中的数据) · 针对update语句生成一个redolog对象,并存入log buffer 中, · 针对update语句生成一个undolog日志,用于事物回滚 · 如果事物提交,那么把redolog对象进行持久化,后续还有其他机制将buffer pool中所修改的数据页持久化到磁盘中 · 如果事物回滚,则利用undolog日志进行回滚
6.Mysql慢查询如何优化
1.检查是否走了索引,如果没有索引可以在查询的字段选择创建合适的索引 2.检查走的索引是否是最优索引 3.检查字段是否是必须的,是否查询了过多字段,查处多余数据 4.检查表中数据是否过多,是否该分库分表 5.检查数据库所在服务器是否低性能,是否可以增加硬件资源
7.Mysql中锁的类型有哪些
基于锁的属性分类:共享锁,排他锁 基于锁的粒度分类: 行级锁(innodb),表级锁(myisam),页级锁,记录锁,间隙锁,临键锁 基于锁的状态分类:意向共享锁,意向排他锁
8.共享锁(share lock)
共享锁又称读锁,当一个事务为数据加上读锁之后,其他事务能对该数据加读锁,但不能加写锁,直到所有的读锁释放之后其他事物才能在该数据上加写锁,读锁的特性是为了提高并发读取数据的性能,读取数据的时候不支持修改,避免出现重复读的问题
9.排它锁(exclusive lock)
排他锁又称写锁,当一个事物为数据加上写锁的时候,其他事务将不能对该数据加任何锁,做任何操作,包括读操作,直到该锁释放之后,其他事务才能对数据进行加锁,排他锁的目的是在数据进行修改的时候,不允许其他事务对数据进行修改,也不允许其他事务进行读取数据,避免出现脏数据和脏读问题
10.表锁
表锁是指上锁的时候锁住的是整个表,当下一个事物访问该表的时候,必须等前一个事务释放了锁之后才能对表进行访问,特点:加锁粒度大,操作简单,容易冲突
11.行锁
行锁指上锁的时候锁住的是表中的一行或多行数据,其他事物访问的时候被锁住的数据不能访问,其他数据可以正常访问
12.Mysql主从同步的原理
mysql主从复制中主要有三个线程:master(binlog dump thred),slave(I/O thread, sql thread),master的一个线程和slave中的两条线程 · 主节点bingo,主从复制的基础是主库记录数据库的所有变更记录到binlog,binlog是数据库服务器启动那一刻起,保存所有修改数据库结构或内容的一个文件 · 主节点log dump线程,当binlog有变动时,log dump线程读取其内容并发送给从节点 · 从节点I/O线程接受binlog内容,并将其写入到relay log文件中 · 从节点的sql线程读取relay log文件内容对数据更新进行重放,最终保证主从数据库一致性 ·
13.MyISAM和Innodb的区别
MyISAM ·不支持事物,但是每次查询都是原子的 ·支持表锁,每次操作对整个表加锁 ·存储表的总行数 ·一个MyISAM有三分存储文件,索引文件,数据文件,表结构文件 ·采用非聚集索引,索引文件的数据存储指向数据文件的指针,辅助索引与主索引基本一致,但是辅索引不用保证唯一性 Innodb: · 支持ACID的事物,支持事物的四种隔离级别 · 支持行及锁及外间约束,因此支持写并发 ·不存储总行数
14.什么是MVCC
多版本并发控制:读取数据时通过一种类似快照的方式将数据保存下来,这样读锁和写锁就不冲突了,不同的事物session会看到自己特定版本的数据 mvcc只在read committed 和repeatable read两种隔离级别下工作,其他两个隔离级别和mvcc不兼容,因为read uncommited总是读取最新的数据行,而不是符合当前事物版本的数据行,而serializable则会对所有的读取的行都加锁
|