1、Mysql存储引擎都有哪些?
1)InnoDB存储引擎
InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键, InnoDB 是默认的 MySQL 引擎。
2)MyISAM存储引擎
MyISAM 基于 ISAM 存储引擎,并对其进行扩展。它是在 Web、数据仓储和其他应用环境下 最常使用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事物。
3)MEMORY存储引擎
MEMORY 存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。
2、事务的 ACID 特性是什么?
数据库事务 transanction 正确执行的四个基本要素。ACID,原子性(Atomicity)、 一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
1)原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停 滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开 始前的状态,就像这个事务从来没有执行过一样。
2)一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
3)隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。 如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保 每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了 防止事务操作间的混淆, 必须串行化或序列化请 求,使得在同一时间仅有一个 请求用于同一数据。 4)持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据 库之中,并不会被回滚。
3、什么是索引?
MySQL数据库中的索引是帮助MySQL高效获取数据的一种数据结构,索引的本质就是数据结构. 索引会有单独的文件进行保存,索引的好处就是更高效的查询数据.
索引的分类 按照功能分类
普通索引:最基本的索引,它没有任何限制。
唯一索引:索引列的值必须唯一,但允许有空值,如果是组合索引,则列值组合必须唯一。
主键索引:一种特殊的唯一索引,不允许有空值,一般在建表时同时创建主键索引。
组合索引:将单列索引进行组合。
外键索引:只有InnoDB引擎支持外键索引,用来保证数据的一致性,完整性和实现级联操作。
全文索引:快速匹配全部文档的方式。InnoDB引擎5.6版本后才支持全文索引,MEMORY引擎不 支持。
按照结构分类
B+Tree索引:MySQL使用最频繁的一个索引数据结构,是InnoDB和MyISAM存储引擎默认的索 引类型。
Hash索引:MySQL中Memory存储引擎默认支持的索引类型。
4、乐观锁与悲观锁
悲观锁概念 就是很悲观,它对于数据被外界修改的操作持保守态度,认为数据随时会修改,整个数据处理中 需要将数据加锁,悲观锁一般都是依靠关系型数据库提供的锁机制. 我们之前所学的行锁,表锁不论是读写锁都是悲观锁。
乐观锁概念 就是很乐观,每次自己操作数据的时候认为没有人会来修改它,所以不去加锁,但是在更新的时 候会去判断在此期间数据有没有被修改。 需要用户自己去实现,不会发生并发抢占资源,只有在提交操作的时候检查 是否违反数据完整性。
乐观锁和悲观锁的使用前提 对于读的操作远多于写的操作的时候,这时候一个更新操作加锁会阻塞所有的读取操作,降低 了吞吐量,最后还要释放锁,锁是需要一些开销的,这时候可以选择乐观锁。 如果是读写比例差距不是非常大或者系统没有响应不及时,吞吐量瓶颈的问题,那就不要去使 用乐观锁,它增加了复杂度,也带来了业务额外的风险,这时候可以选择悲观锁。
5、事务隔离级别导致的问题
未提交读(READ UNCOMMITTED):未提交读隔离级别也叫读脏,就是事务可以读 取其它事务未提交的数据。
提交读(READ COMMITTED):在其它数据库系统比如 SQL Server 默认的隔离级别就 是提交读,已提交读隔离级别就是在事务未提交之前所做的修改其它事务是不可见的。
可重复读(REPEATABLE READ):保证同一个事务中的多次相同的查询的结果是一致 的,比如一个事务一开始查询了一条记录然后过了几秒钟又执行了相同的查询,保证 两次查询的结果是相同的,可重复读也是 mysql 的默认隔离级别。
可串行化(SERIALIZABLE):可串行化就是保证读取的范围内没有新的数据插入,比 如事务第一次查询得到某个范围的数据,第二次查询也同样得到了相同范围的数据, 中间没有新的数据插入到该范围中。
6、优化SQL的方法
选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,例如’省份’、'性别’最好适用ENUM
使用连接(JOIN)来代替子查询
适用联合(UNION)来代替手动创建的临时表
事务处理
锁定表、优化事务处理
适用外键,优化锁定表
建立索引
7、什么是三大范式
第一范式:1NF要求字段属性具有原子性,不可再分解。是对属性的原子性约束。
第二范式:2NF要求非主属性完全函数依赖于键码。是对记录的唯一性约束,要求记录有唯一标识。
第三范式:3NF要求非主属性不传递函数依赖于键码。是对字段冗余性的约束,即任何字段不能由其他字段派生出来。
8、范式化设计的优缺点
优点:减少数据冗余,使得更新速度快,表格体积小
缺点:对于查询需要多个表进行关联的情况,降低了查询效率,难以进行索引优化。
9、反范式化设计的优缺点
优点:可以减少表的关联,更好地进行索引优化
缺点:数据冗余以及数据异常,数据的修改需要更多的成本。
10、数据库索引设计原则
对查询频次较高,且数据量比较大的表建立索引。
使用唯一索引,区分度越高,使用索引的效率越高。
索引字段的选择,最佳候选列应当从where子句的条件中提取,如果where子句中的组合比较多,那 么应当挑选最常用、过滤效果最好的列的组合。
使用短索引,索引创建之后也是使用硬盘来存储的,因此提升索引访问的I/O效率,也可以提升总体 的访问效率。假如构成索引的字段总长度比较短,那么在给定大小的存储块内可以存储更多的索引 值,相应的可以有效的提升MySQL访问索引的I/O效率。
索引可以有效的提升查询数据的效率,但索引数量不是多多益善,索引越多,维护索引的代价自然也 就水涨船高。对于插入/更新/删除等DML操作比较频繁的表来说,索引过多,会引入相当高的维护代 价,降低DML操作的效率,增加相应操作的时间消耗,另外索引过多的话,MySQL也会犯选择困难病, 虽然最终仍然会找到一个可用的索引,但无疑提高了选择的代价。
|
|