学习内容:
- 数据库存储引擎
- 索引
- 范式
- 事务
知识点:
1.数据库存储引擎是什么?
- 数据库底层软件组织
- 用于数据库管理系统的增删改查操作
- 不同的存储引擎提供不同的存储机制,索引技巧,锁定水平等功能
2.常见的存储引擎?
- InnoDB:低层为B+树,每个节点对应一个page(16k),非叶子节点存键值,叶子节点存数据。
- MyISAM:MySql默认存储引擎,不提供事务支持,不支持行级锁和外键,采用表锁,插入和更新数据效率低,但读取数据速度快。
- TokuDB: 低层为分形树(与B+树类似),每个孩子指针除了指向一个孩子节点外还带有一个Message Buffer, Message Buffer为一个先入先出的队列用于缓存更新操作。
例如:一次操作只需要落在某节点Message Buffer就可以马上返回,并不需要搜索到子节点,这些缓存的更新会在查询时或后台异步合并应用到对应的节点中。 - Memory:其使用存储在内存中的内容来创建表,而且所有数据也放在内存中。访问速率快,默认使用HASH索引。但是一旦服务器关掉,表中数据就会丢失。
3.InnoDB和MyISAM的区别?
InnoDB | MyISAM | |
---|---|---|
事务 | 支持 | 不支持 |
外键 | 支持 | 不支持 |
锁 | 表,行级锁 | 表锁 |
全文索引 | 不支持 (5.7以后的InnoDB支持全文索引) | 支持 (在涉及全文索引领域的查询效率上MyISAM速度更快高) |
聚集索引 | InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的,InnoDB的B+树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值 | InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的。MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针。 |
查询行数 | InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。 | InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。 |
其他 | InnoDB表必须有唯一索引(如主键)(用户没有指定的话会自己找/生产一个隐藏列Row_id来充当默认主键 | Myisam可以没有 |
4.如何选择InnoDB和MyISAM?
- 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
- 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读也有写,请使用InnoDB。
- 系统奔溃后,MyISAM恢复起来更困难,能否接受;
- MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM)。
5.什么是索引?
- 帮助数据库快速获取数据的数据结构。索引是对数据表中一个或多个列的值进行排序的结构,建立索引有助于快速获取信息。
6.mysql中的四种索引?
- 主键索引
- 唯一索引
- 普通索引
- 全文索引
7.建索引的几大原则
- 最左前缀匹配原则,mysql优先匹配左边的索引,重要的索引放左边。
- 尽量选择区分度高的列作为索引
- 为常作为查询条件的字段建立索引
- 为经常需要排序、分组和联合操作的字段建立索引
- 尽量的扩展索引,不要新建索引
- 限制索引的数目,索引越多更新表花费的时间越长
- 尽量使用数据量少的索引
- 如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。
- 删除不再使用或者很少使用的索引
8.数据库的三范式
- 第一范式:列不可分
- 第二范式:行可以唯一区分,主键约束,一张表只描述一件事
- 第三范式:表中非主属性不能依赖与其他表的非主属性,外键约束
- 三大范式一级一级依赖
9.事务的四大特性
- 原子性:是指事务是一个不可分割的工作单元,事务中的操作要么都发生,要么都不发生。
- 一致性:是指事务前后数据的完整性要保持一致。
- 隔离性:是指是指多个用户并发访问数据库的时候,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数要相互隔离。
- 持久性:是指一个事务一旦提交,他对数据库中数据的改变就是就是永久性的。
9.不考虑隔离性,会引发的问题?
- 脏读:是指一个事务读到另一个事务未提交的数据
- 不可重复读:在一个事务中,两次查询到的结果不一致(针对 update 操作)
- 虚读(幻读):在一个事务中,两次查询到的结果不一致(针对 insert 操作)
11.事务的隔离级别
- 读未提交(Read uncommitted):最低级别,上述情况都不能避免
- 读已提交(Read committed):可避免 脏读 发生。Oracle默认隔离级别
- 可重复读(Repeatable read):可避免 脏读、不可重复读 发生。Mysql默认隔离级别
- 串行化(Serializable):可避免 脏读、不可重复读、虚读 发生