知行

总结之后必有收获 开始使用

MYSQL 数据库知识点

**01.**MySQL 和 MongoDB 的区别有哪些?如何选择?
关系型数据库和文档型数据库,存储方式 数据处理,架构特点。
MongoDB 适于事件的记录,内容管理或者博客平台等。

**02.**分析一下 MySQL 和 MongoDB 应用场景 (*HBase)

  • 1.如果需要将 MongoDB 作为后端 db 来代替 MySQL 使用,即这里 MySQL 与 MongoDB 属于平行级别,那么,这样的使用可能有以下几种情况的考量: (1)mongodb 所负责部分以文档形式存储,能够有较好的代码亲和性,JSON 格式的直接写入方便。(如日志之类) (2)从 data models 设计阶段就将原子性考虑于其中,无需事务之类的辅助。开发用如 nodejs 之类的语言来进行开发,对开发比较方便。 (3)mongodb 本身的 failover 机制,无需使用如 MHA 之类的方式实现。

  • 2.将 MongoDB 作为类似 Redis ,memcache 来做缓存 db,为 MySQL 提供服务,或是后端日志收集分析。 考虑到 MongoDB 属于 nosql 型数据库,SQL 语句与数据结构不如 MySQL 那么亲和 ,也会有很多时候将 MongoDB 做为辅助 MySQL 而使用的类 Redis memcache 之类的缓存 db 来使用。 亦或是仅作日志收集分析。

03. 听说过事务吗?****(必考)

答:

作为单个逻辑工作单元执行的一系列操作,满足四大特性:

  1. 原子性(Atomicity):事务作为一个整体被执行 ,要么全部执行,要么全部不执行;

  2. 一致性(Consistency):保证数据库状态从一个一致状态转变为另一个一致状态;

  3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行;

  4. 持久性(Durability):一个事务一旦提交,对数据库的修改应该永久保存。

04. 事务的并发问题有哪几种?

**答:**丢失更新、脏读、不可重复读以及幻读。

05. 数据库中的锁有哪几种?

**答:**独占锁、排他锁以及更新锁。

在 MySQL 的 InnoDB 中,预设的 Tansaction isolation level 为 REPEATABLE READ(可重读)
在 SELECT 的读取锁定主要分为两种方式:

  SELECT ... LOCK IN SHARE MODE 

  SELECT ... FOR UPDATE

  这两种方式在事务(Transaction) 进行当中 SELECT 到同一个数据表时,都必须等待其它事务数据被提交(Commit)后才会执行。

  而主要的不同在于 LOCK IN SHARE MODE 在有一方事务要 Update 同一个表单时很容易造成死锁。

  简单的说,如果 SELECT 后面若要 UPDATE 同一个表单,最好使用 SELECT ... UPDATE。

06. 事务的隔离级别有哪几种?

**答:**读未提交、读已提交、可重复读和序列化。

imagepng

**扩展问题:**MySQL 事务默认隔离级别是哪个?

**答:**可重复读。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大,鱼和熊掌不可兼得啊。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为 Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

07. 数据库的索引有什么作用? 底层数据结构是什么,为什么使用这种数据结构?

答:

  1. 索引  是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息;

  2. 底层数据结构是 B+ 树;

  3. 使用 B+ 树的原因:查找速度快、效率高,在查找的过程中,每次都能抛弃掉一部分节点,减少遍历个数。( 此时,你应该在白纸上画出什么是 B+ 树 )

**扩展问题:**聚簇索引和非聚簇索引的区别?

08. MyISAM 和 InnoDB 的区别有哪些?

答:

  • MyISAM 不支持事务,InnoDB 是事务类型的存储引擎;

  • MyISAM 只支持表级锁,BDB 支持页级锁和表级锁,默认为页级锁;而 InnoDB 支持行级锁和表级锁,默认为行级锁;

  • MyISAM 引擎不支持外键,InnoDB 支持外键;

  • MyISAM 引擎的表在大量高并发的读写下会经常出现表损坏的情况;

  • 对于 count( ) 查询来说 MyISAM 更有优势;

  • InnoDB 是为处理巨大数据量时的最大性能设计,它的 CPU 效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的;

  • MyISAM 支持全文索引(FULLTEXT),InnoDB 不支持;(MySQL5.6 版本开始支持_InnoDB_引擎的_全文索引_)

  • MyISAM 引擎的表的查询、更新、插入的效率要比 InnoDB 高。

  • 索引用的 B+ tree 来储存数据,MyISAM 索引的指针指向的是键值的地址,地址存储的是数据。 也就是说它的索引和实际的数据是分开的,只不过是用索引指向了实际的数据,这种索引就是所谓的非聚集索引。

Innodb 的索引文件本身就是数据文件,即 B+Tree 的数据域存储的就是实际的数据,这种索引就是聚集索引。这个索引的 key 就是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。

InnoDB 的辅助索引数据域存储的也是相应记录主键的值而不是地址,所以当以辅助索引查找时,会先根据辅助索引找到主键,再根据主键索引找到实际的数据。所以 Innodb 不建议使用过长的主键,否则会使辅助索引变得过大。 建议使用自增的字段作为主键,这样 B+Tree 的每一个结点都会被顺序的填满,而不会频繁的分裂调整,会有效的提升插入数据的效率。

**最主要的区别是:**MyISAM 表不支持事务、不支持行级锁、不支持外键。 InnoDB 表支持事务、支持行级锁、支持外键。(可直接回答这个)

09. 数据库中 Where、group by、having 关键字:

答:

关键字作用:

  1. where 子句用来筛选 from 子句中指定的操作所产生的的行;

  2. group by 子句用来分组 where 子句的输出;

  3. having 子句用来从分组的结果中筛选行;

having 和 where 的区别:

  1. 语法类似,where 搜索条件在进行分组操作之前应用;having 搜索条件在进行分组操作之后应用;

  2. having 可以包含聚合函数 sum、avg、max 等;

  3. having 子句限制的是组,而不是行。

当同时含有 where 子句、group by 子句 、having 子句及聚集函数时,执行顺序如下:

  1. 执行 where 子句查找符合条件的数据;

  2. 使用 group by 子句对数据进行分组;对 group by 子句形成的组运行聚集函数计算每一组的值;最后用 having 子句去掉不符合条件的组。

ps:注意 事务机制、隔离级别

评论
留下你的脚步