一、Mysql
1.1 事务的隔离界别
所有的事务都能看到未提交的事务的执行结果,容易出现脏读。
大多数默认的事务隔离级别,但不是mysql的。一个事务从开始到提交前都是不可见的,
但是该事务级别支持“不可重复读”,所以用户在运行同一语句两次,结果是不同的。
mysql默认的隔离级别,解决了读未提交导致的问题,但是会导致幻读,InnoDB和Falcon存储引擎通过多版本控制解决了幻读。
事务隔离的最高级别,强制事务排序,解决幻读。简而言之就是在每个读的数据上锁。
1.2 mysql的复制原理
(1) master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
(2) slave服务器会在士定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
(3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
1.3 mysql的聚簇索引和非聚簇索引
mysql的索引类型是和存储引擎相关的,innodb存储引擎数据文件跟索引文件全部放在ibd文件中,myisam的数据文件放在myd中,索引文件放在myi文件中,区分两者索引只需要判断数据和索引是否放在一起。
1.4 索引的的原理
Mysql用到两种数据结构:B+Tree索引和Hash索引。
Inodb存储引擎默认B+Tree索引。
Memory存储引擎默认Hash引擎。查询单挑速度快,范围查找慢。
Memory表会存储在内存,断电会消失。
1.5 mysql的锁的类型有哪些?
基本锁的属性被分类成共享锁(读锁)和排他锁(写锁)。
根据锁的粒度分为行级锁(innodb)、表级锁(innodb、myisam)、页级锁(innodb)、记录锁、间隙锁、临键锁。
共享锁:当一个事务为数据加上读锁之后,其他事务只能对该数据加读锁,不能加写锁。直到所有的读锁释放后,其他事务才能加持写锁。
排他锁:当一个事务加上写锁、其他请求不能对数据加上任何的锁,锁释放时才能加其他锁。
表锁:上锁锁住整个表,当下一个事务进行访问该表时候,必须等待前一个事务释放锁。特点:粒度大,加锁简单,容易冲突。
行锁:上锁的时候锁住一行或者多行记录,其他事务访问该表,被锁住的记录不能访问。特点:加锁麻烦、不容易冲突。相比表锁支持更高的并发。
记录锁:属于行锁的一种,只不过锁住的是某条数据,可以避免数据查询被修改出现重复读的问题,也可以避免脏读。
页锁: 介于行级锁和表级锁中间的一种锁,表锁速度快,冲突多,行锁冲突少,速度慢,所以取了折中。
间隙锁:属于行锁的一种,间隙锁在事务加锁锁住表记录的某个区间。当id出现空隙,会形成一个区间,左开右闭。
临键锁:属于行锁的一种,他是innodb默认算法,临键锁会把查询到的记录锁住,同时把范围查询的内的所有间隙空间锁住,最后把相邻的空间锁住。
1.5 mysql为什么要进行主从同步?
- 在复杂的业务系统中,有一个sql语句需要锁表,暂时不能进行读的业务,很影响性能,需要使用主从复制,主库用来写,从库用来读。进行读写分离。
- 做数据的热备。
- 在业务扩展,I/O访问频率过高,需要做多库的存储,降低磁盘I/O访问的频率。
1.6 mysql的索引有哪些?对数据库性能的影响
- 普通索引:允许索引的数据的值重复。
- 唯一索引:保证数据记录的唯一性。
- 主键索引:唯一的特殊索引,在一个表里面只能定义一个主键索引,使用primary key来定义。
- 联合索引:索引可以覆盖多个数据列。
- 全文索引:通过创建倒排索引,可以极大提升检索效率。
索引能够提高查询速度,在查询过程中,mysql使用优化隐藏器提高效率。
索引会占用空间,执行删除、插入、修改比较浪费时间。
1.6 怎么处理mysql的慢查询?
- 开启慢查询日志,定位sql语句。
- 分析sql,是否load了其他的额外数据。
- 分析语句的执行计划,修改语句或修改索引,增加命中索引的次数。
- sql语句无法优化,通过对数据进行横向或纵向切分。
1.7 B+树
- 二叉树->二叉搜索树(BST)->二叉平衡树(ALV)->红黑树->B树->B+树
- BST为左节点小于父节点,右节点大于父节点;ALV对BST的极端情况进行优化,通过左旋和右旋保证二叉树平衡;红黑树对ALV进行优化,将增加和查询折中,只有最长路径为最短路径的两倍才会进行左旋或右旋。B树为有序的多叉树,存储的是一个范围的树,当这个范围大于最大的degree,就会改变树的形状。
B树
每次读取一个磁盘块为16k,假如数据为1k,其他指针不占用内存,3层存储的数据为16^3。
B+树
B+树将所有的数据存储到叶子节点中,在指针占用10字节的情况下,3层能存储1600^2*16=4000w条数据。B+树有两种查找方式,第一种从根节点进行范围查找;另一种是在叶子节点通过双向指针进行数据的遍历。
- mysql中有n个索引,最多有一个聚簇索引。
- 回表:先根据普通索引(普通索引的B+树中存放的数据为聚簇索引的key值),查询到聚簇索引的key值,再通过key值查找对应的数据。
- 索引覆盖:select id,name from xx where name = "xxx"根据name查询到id,只需要查询name和id,不需要从聚簇索引查询数据。
- 联合索引可能包含多个索引列,遵循最左匹配,sql语句最左匹配,mysql有优化器,查询条件与索引顺序不一样,会进行