1.索引
目的:为了提高查找的速度(但是索引拖慢了增删改的速度) 本质上就是把数据库中的记录按照一点的规则/数据结构给组织起来。
1.1使用场景
(1)数据量较大,且经常对这些列进行条件查询。 (2)该数据库的插入操作,及对这些列的修改频率较低。 (3)索引会占用额外的磁盘空间。
1.2索引相关语句
查看索引:show index from 表名; 创建索引:create index 索引名 on 表名(字段名); 删除索引:drop index 索引名 on 表名;
1.3索引内部的数据结构
B+树(N叉搜索树) 【注:只有B+树和B-树(B树),没有B减树】 以下图为例: 1.父节点里面的值,会作为子节点的最大值出现(也可以是最小值)这样的目的就是让所有叶子节点就包含了整体数据的全集。 2.叶子节点按照顺序通过链表的方式连接了起来,高效实现范围查找。 3.每一行数据的其他列信息,只存在于叶子节点上,非叶子节点仅仅包含索引列的数据。非叶子节点占有的空间就比较小了,可以把这部分内容直接放到内存中,后续查找就可以主要去读内存,减少很多次磁盘操作。
1.4面试题:为什么不用线性表,二叉搜索树,哈希表?
答:线性表效率比较低;二叉搜索树(AVL,红黑树)高度相比较B+树来说高,不合适;哈希表只能进行值相等的查找,不太方便进行值比较大小的范围查找。
2.事务
2.1什么是事务?
数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么全执行,要么全不执行。
2.2事物的使用
(1)开启事务
start transaction
(2)执行多条SQL语句
(3)回滚或提交
roolback/commit
2.3事务的特性:
(1)原子性:把若干个SQL语句打包成一个整体,要么全执行,要么全不执行。 (2)一致性:事务执行完毕之后,数据仍然是合理的。 (3)持久性:事务执行完毕之后,数据存在磁盘上,哪怕重启主机,数据也仍然存在。 (4)隔离性:并发执行的事务所产生的问题和解决方案。
3.谈谈MySQL并发执行事务可能产生的问题
(1)脏读问题 一个事务A在修改数据,另一个事务B直接就读取A正在修改的数据,此时B读到的就是脏数据,这个动作就叫脏读
如何解决:给写操作加锁,并发程度就降低了,同时隔离性就提高了。
(2)不可重复读 事务A修改数据然后提交,提交完毕后事务B开始读取事务,事务B中包含了很多次读操作,如果事务B两次读取的操作得到的结果不一样,就是不可重复读。
如何解决:给读操作加锁,对并发又进一步提供了限制,并发程度更低,隔离性更高。
(3)幻读 事务B正在读取数据,事务A插入了新的数据/删除了某个数据,事务B两次读取到的数据集的个数发生了变化。
如何解决:串行化,彻底让事务之间串行执行,不涉及任何并发事情,一个事务执行完再执行下一个。
4.谈谈MySQL中事务的隔离级别
(1)read uncommitted 没有做出任何隔离限制,三个问题都存在,执行效率最高。
(2)read committed 进行写加锁,并发程度降低,隔离性增加,脏读问题解决。
(3)repeatable read 读写加锁,并发程度降低,隔离性进一步增加,脏读问题以及不可重复读问题解决。 【MySQL默认的隔离级别】
(4)serializable 串行化,并发程度最低,隔离性最高,三个问题都解决了,此时执行效率最低。
|