文章目录
- 1 B树和B+树的区别,为什么Mysql使用B+树
- 2 Mysql锁有哪些,如何理解?
- 3 索引的基本原理
- 4 索引设计的原则?
- 5 索引覆盖是什么
- 6 最左前缀原则是什么
- 7 lnnodb是如何实现事务的
- 8 简述MylSAM和InnoDB的区别
- 9 事务基本特性ACID分别是:
- 10 什么是MVCC
- 11 存储引擎的类型
- 12 数据库表设计时,字段你会如何选择?
- 13 Mysql中VARCHAR(M)最多能存储多少数据?
- 14 请说下事务的基本特性
- 15 事务并发可能引发什么问题?
- 16 简述mysql中索引类型及对数据库的性能的影响
- 17 简单描述下MySQL各种索引?
- 18 索引设计的原则?
- 19 什么是三星索引?
- 20 mysql执行计划怎么看
- 21 mysql聚簇和非聚簇索引的区别
- 22 mysql索引的数据结构,各自优劣
- 23 lnnoDB—棵B+树可以存放多少行数据?
- 24 什么是全局锁、共享锁、排它锁?
- 25 谈一下MySQL中的死锁
- 26 sql的慢查询的优化?(面试我被问到)
- 27 ACID靠什么保证的?
- 28 mysql主从同步原理
1 B树和B+树的区别,为什么Mysql使用B+树
B树的特点:
1.节点排序
2.—个节点了可以存多个元素,多个元素也排序了
B+树的特点:
1.拥有B树的特点
2.叶子节点之间有指针
3.非叶子节点上的元素在叶子节点上都冗余了,也就是叶子节点中存储了所有的元素,并且排好顺序
Mysql索引使用的是B+树,因为索引是用来加快查询的,而B+树通过对数据进行排序所以是可以提高查询速度的,然后通过一个节点中可以存储多个元素,从而可以使得B+树的高度不会太高,在Mysql中一个nnodb页就是一个B+树节点,一个nnodb页默认16kb,所以一般情况下一颗两层的B+树可以存2000万行左右的数据,然后通过利用B+树叶子节点存储了所有数据并且进行了排序,并且叶子节点之间有指针,可以很好的支持全表扫描,范围查找等SQL语句
2 Mysql锁有哪些,如何理解?
按锁粒度分类:
1.行锁:锁某行数据,锁粒度最小。并发度高
2,表锁:锁整张表。锁粒度最大,并发度任3。间腺锁:锁的是一个区间
还可以分为:
1.共享锁:也就是读锁,一个事务给某行数据加了读锁,其他事务也可以读,但是不能写
2。排它锁:也就是写锁,一个事务给某行数据加了写锁,其他事务不能读,也不能写
还可以分为:
1.乐观锁:并不会真正的去锁某行记录,而是通过一个版本号来实现的
2.悲观锁:上面的行锁、表锁等都是悲观锁
3 索引的基本原理
索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。
索引的原理:就是把无序的数据变成有序的查询
1.把创建了索引的列的内容进行排序
2.对排序结果生成倒排表
3.在倒排表内容上拼上数据地址链
4.在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据
4 索引设计的原则?
查询更快、占用空间更小
1.适合索引的列是出现在where子句中的列,或者连接子句中指定的列
2.基数较小的表,索引效果较差,没有必要在此列建立索引
3,使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间,如果搜索词超过絷引前缀长度,则使用索引排除不四督的行,然后检查其余行是否可能匹配。
4,不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引例越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。
5,定义有外键的数据列一定要建立索引。
6,更新频繁字段不适合创建索引
7.若是不能有效区分数据的列不适合做索引列如性别,男女未知,最多也就三种,区分度实在太低)
5 索引覆盖是什么
索引覆盖就是一个SQL在执行时,可以利用索引来快速查找,并且此SQL所要查询的字段在当前索引对应的字段中都包含了,那么就表示此SQL走完索引后不用回表了,所需要的字段都在当前索引的叶子节点上存在,可以直接作为结果返回了
6 最左前缀原则是什么
当一个SQL想要利用索引是,就一定要提供该索引所对应的字段中最左边的字段,也就是排在最前面的字段,比如针对a.b.c三个字段建立了一个联合索引,那么在写一个sql时就一定要提供a字段的条件,这样才能用到联合索引,这是由于在建立abc三个字段的联合索引时,底层的B+树是按照abc三个字段从左往右去比较大小进行排序的,所以如果想要利用B+树进行快速查找也得符合这个规则
7 lnnodb是如何实现事务的
Innodb通过Buffer Pool,LogBuffer,Redo Log,Undo Log来实现事务,以一个update语句为例:
1.Innodb在收到一个update语句后,会先根据条件找到数据所在的页,并将该页缓存在Buffer Pool中
2.执行update语句,修改Buffer Pool中的数据,也就是内存中的数据
3.针对update语句生成一个RedoLog对象,并存入LogBuffer中
4.针对update语句生成undolog日志,用于事务回滚
5.如果事务提交,那么则把RedoLog对象进行持久化,后续还有其他机制将Buffer Pool中所修改的数据页持久化到磁盘中
6.如果事务回滚,则利用undolog日志进行回滚
8 简述MylSAM和InnoDB的区别
MylSAM:
不支持事务,但是每次查询都是原子的;
支持表级锁,即每次操作是对整个表加锁;
存储表的总行数;
一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;
·采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性.
lnnoDb:
支持ACID的事务,支持事务的四种隔离级别;
支持行级锁及外键约束:因此可以支持写并发;
不存储总行数;
一个nnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为2G),受操作系统文件大小的限制;
主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。
9 事务基本特性ACID分别是:
原子性指的是一个事务中的操作要么全部成功,要么全部失败。
一致性指的是数据库总是从一个一致性的状态转换到另外一个一致性的状态。比如A转账给B10块钱,假设A只有9O块,支付之前我们数据库里的数据都是符合约束的但是如果事务执行成功了,我们的数据库数据就破坏约束了,因此事务不能成功,这里我们说事务提供了一致性的保证
隔离性指的是一个事务的修改在最终提交前,对其他事务是不可见的。
持久性指的是一旦事务提交,所做的修改就会永久保存到数据库中。
隔离性有4个隔离级别,分别是:
read uncommit读未提交,可能会读到其他事务未提交的数据,也叫做脏读。
用户本来应该读取到d=1的用户age应该是10,结果读取到了其他事务还没有提交的事务,结果读取结果age=20,这就是脏读。read commit读已提交,两次读取结果不一致,叫做不可重复读。
不可重复读解决了脏读的问题,他只会读取已经提交的事务。
用户开启事务读取id=1用户,查询到age=10,再次读取发现结果=20,在同一个事务里同一个查询读取到不同的结果叫做不可重复读。repeatable read可重复复读,这是mysql的默认级别,就是每次读取结果都一样,但是有可能产生幻读。
.serializable 串行,一般是不会使用的,他会给每一行读取的数据加锁,会导致大量超时和锁竞争的问题。
10 什么是MVCC
MVCC(Mult-Vversion Concurrency Contral,多版本并发控制)指的就是在使用READCOMMITTD、REPEATABLEREAD这两种隔离级别的事务在执行普通的SECT操作时访问记录的版本链的过程。可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。READ COMMTTD