前言作为后端猿,我们每天都和mysql打交道,不出意外。除了每天写不枯燥的CURD语句外,关于mysql我们还应该了解哪些基础知识呢?直奔主题,简单画出mysql的逻辑架构图?访问层------------------????缓存解析器??优化器----------------------Enginemysql常见的引擎有哪些,有什么区别?InnoDB支持事务行锁。聚集索引辅助索引(secondaryindex)索引存储主键。MyISAM不支持事务表锁崩溃。无法安全地恢复非聚集索引。辅助索引(secondaryindex)索引存放的是实际数据的地址。Memory基于固定长度的内存表锁字段,不支持blob、text,即使指定了vachar的实际存储,也会转换为charArchive,只支持insert/select操作,适用于日志等.ACDI的事务概念是什么?A:Atomicity,原子性, 一个事务的所有操作都被视为一个整体,要么全部成功,要么全部失败。C:Consistency,Consistency, 一个事务下所有的数据状态都发生变化,所有的变化只有在事务提交成功的时候才会发生。D:Durability,持久性, 一旦事务提交成功,由此产生的数据变化将永久保存在数据库中。I:Isolation,隔离, 一个事务在提交前对其他事务不可见。什么是脏读、幻读和不可重复读?脏读:读取未提交事务的数据,数据可能回滚,不符合隔离的定义。幻读:当一个事务批量读取一批数据时,另一个事务提交新数据,当前一个事务再次读取时,就会产生幻读行。不可重复读:同一个查询执行两次可能会得到不同的结果。mysql事务的隔离级别是多少?默认隔离级别是多少?未提交读:一个事务没有提交,另一个事务可以读,这样的后果就是脏读。提交读(也称为不可重复读):未提交的事务对其他事务不可见,但会出现幻读和不可重复读。可重复读(mysql默认隔离级别):保证同一事务下多次读的结果一致,但会出现幻读。Serializable:严格的串行阻塞,并发性差。隔离级别脏读不可重复读幻读ReadUncommitted√√√ReadCommitted×√√RepeatableRead××√Serializable×××什么是MVCC?简述MVCC的作用和原理?MVCC:MultiVersionConcurrencyControl, 多版本并发控制,mysql防止幻读的技术手段。每行数据都有一个gaprow,gaprow存储了该行数据的创建时间和删除时间。这里的时间其实就是交易的版本号。选择数据时:只查询创建时间小于等于当前事务版本号->当前事务或当前事务之前插入的行,删除时间大于当前版本号的行->该行在当前交易版本之前没有被删除。更新数据时:在原a行的基础上复制a'行,将a行的删除时间设置为当前事务版本号,将a'行的创建时间设置为当前事务版本号。插入数据时:记录创建时间为当前事务版本号。删除数据时:记录删除时间为当前交易版本号。死锁是怎么产生的,写一个简单的例子?死锁的原因是两个事务互相等待释放,造成循环依赖。Mysql使用死锁检测(检测到循环依赖时返回错误)和死锁超时(超时回滚持有最少行锁的事务)的方式来尽可能避免死锁。例如:行锁:UPDATE`table_demo`SET`a`='test'WHERE`b`='lalala';UPDATE`table_demo`SET`b`='test'WHERE`a`='lalala';UPDATE`table_demo`SET`b`='test'WHERE`a`='lalala';UPDATE`table_demo`SET`a`='test'WHERE`b`='lalala';什么是聚簇索引和非聚簇索引?聚簇索引:InnoDB,B+树的叶子节点存放的是实际数据。非聚集索引:MyISAM,B+树的叶子节点存放实际数据的地址。什么是覆盖索引?覆盖索引:要查询的行被索引覆盖,可以直接从索引中读取,不需要回表查询。例如:CREATETABLE`demo_table`(`id`int(11)unsignedNOTNULLAUTO_INCREMENTCOMMENT'自增ID',`username`char(32)NOTNULLDEFAULT''COMMENT'用户名',`password`char(32)NOTNULLDEFAULT''COMMENT'密码',PRIMARYKEY(`id`),KEY`idx_username`(`username`))ENGINE=InnoDBDEFAULTCHARSET=UTF8;explainselect`username`from`demo_table`where`username`='演示';+----+------------+------------+------+---------------+------------+--------+--------+-----+------------------------+|编号|选择类型|表|类型|可能的键|钥匙|密钥长度|参考|行|额外|+----+------------+------------+------+--------------+------------+--------+--------+--------+------------------------+|1|简单|演示表|参考|idx_用户名|idx_用户名|96|常量|1|在哪里使用;使用索引|+----+------------+------------+------+------------+------------+--------+--------+------+------------------------+在Extra中使用索引意味着使用覆盖索引。索引的最左前缀匹配原则是什么?个人目前的理解:比如使用联合索引,从左到右匹配,直到索引字段或者第一个范围搜索(between,like,greaterthan,lessthan)不匹配,这部分索引才有效.为什么InnoDB不使用红黑树而是使用B+树作为索引来存储数据结构,简单画出B+树?(目前个人理解比较浅,欢迎积极指正~)红黑树的本质是二叉树。每个节点最多有两个子节点,所以红黑树的深度更深。B树的每个节点最多可以有n个子节点。根节点常驻内存,每个节点只申请一个页面大小。如果每个节点有100个子节点,我们基本上只需要数百万数据的深度。如果是3,则可以save=>100^3,减少了io的数量(一个节点的大小通常是磁盘上一个page的大小)。还有就是“局部性原则”(一条数据一旦被查询,可能它附近的数据也需要被查询),其次,B+树的叶子节点组成一个链表,这样我们就可以很方便的进行查询一个范围的数据,其次,B+树的根节点和内部节点只存储指向索引的下一个子节点位置的指针,数据只存储在叶子节点中,这样非叶子节点就可以有更多的空间来存储索引的位置和索引的范围可以尽可能大,所以树的深度可以尽可能小。结论将在后续不断修改和补充。文中如有不妥,欢迎大家积极指正。谢谢。扫描下方二维码关注我的技术公众号,及时为大家分享我的原创技术
