8. mysql的引擎有什么?他们的区别
a. InnoDB:
1. ⽀持事务处理
2. 支持外键
3. ⽀持行锁
4. 不⽀持FULLTEXT类型的索引(在Mysql5.6已引⼊)
5. 不保存表的具体⾏数,扫描表来计算有多少行
6. 对于AUTO_INCREMENT类型的字段,必须包含只有该字段的索引
7. DELETE 表时,是一行一行的删除
8. InnoDB 把数据和索引存放在表空间里面
9. 跨平台可直接拷贝使用
10. 表格很难被压缩
b. MyISAM:
1. 不⽀持事务,回滚将造成不完全回滚,不具有原⼦子性
2. 不⽀持外键
3. ⽀持全文搜索
4. 保存表的具体行数,不带where时,直接返回保存的行数
5. DELETE 表时,先drop表,然后重建表
6. MyISAM 表被存放在三个文件 。frm 文件存放表格定义。数据文 件是MYD (MYData) 。索引文件是MYI (MYIndex)引伸
7. 跨平台很难直接拷贝
8. AUTO_INCREMENT类型字段可以和其他字段一起建立联合索引
9. 表格可以被压缩
c. 选择:因为MyISAM相对简单所以在效率上要优于InnoDB.如果系统读多,写少。对原子性要求低。那么MyISAM最好的选择。且MyISAM恢复速度快。可直接用备份覆盖恢复。如果系统读少,写多的时候,尤其是并发写⼊高的时候。InnoDB就是首选了。两种类型都有自己优缺点,选择哪个完全要看自己的实际类弄。
9. innodb如何实现mysql的事务
事务进行过程中,每次sql语句执行,都会记录undo log和redo log,然后更新数据形成脏页,然后redolog按照时间或者空间等条件进行行落盘,undo log和脏页按照checkpoint进行落盘,落盘后相应的redo log就可以删除了。此时,事务还未COMMIT,如果发生崩溃,则首先检查checkpoint记录,使用相应的redo log进行数据和undo log的恢复,然后查看undo log的状态发现事务尚未提交,然后就使用undo log进行事务回滚。事务执行COMMIT操作时,会将本事务相关的所有redo log都进行落盘,只有所有redo log落盘成功,才算COMMIT成功。然后内存中的数据脏页继续按照checkpoint进行落盘。如果此时发生了崩溃,则只使用redolog恢复数据。
10. 说说b+树的原理
B-tree:
B-tree 利用了磁盘块的特性进行构建的树。每个磁盘块一个节点,每个节点包含了很关键字。把树的节点关键字增多后树的层级比原来的二叉树少了,减少数据查找的次数和复杂度。
B-tree巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页(每页为4K),这样每个节点只需要⼀一次I/O就可以完全载⼊。B-tree 的数据可以存在任何节点中。
B+tree:
B+tree 是 B-tree 的变种,B+tree 数据只存储在叶子节点中。这样在B树的基础上每个节点存储的关键字数更多,树的层级更少所以查询数据更快,所有指关键字指针都存在叶子节点,所以每次查找的次数都相同所以查询速度更稳定。
12. 让你设计一个索引,你会怎么设计
mysql默认存储引擎innodb只显式支持B树索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。
13. git和svn的区别
1、Git是分布式的,⽽而SVN不是;
2、GIT把内容按元数据方式存储,而SVN是按⽂文件
3、分支不同:git分支切换很方便便;SVN分支就是版本库的另外一个目录;
4、GIT没有一个全局的版本号,而SVN有,SVN的版本号实际是任何一个相应时间的源代码快照。
5、GIT的内容完整性要优于SVN(GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。)
14. git命令的一些底层原理理以及流程
https://www.jianshu.com/p/2b47a3078a46
a. git init:使用git init初始化一个新的目录时,会生成⼀个.git的⽬目录, 该目录即为本地仓库。一个新初始化的本地仓库是这样的:
description用于GitWeb程序
config配置特定于该仓库的设置(还记得git config的三个配置级别么)
hooks放置客户端或服务端的hook脚本
HEAD传说中的HEAD指针,指明当前处于哪个分⽀
objectsGit对象存储目录
refsGit引用存储目录
branches放置分⽀引用的目录
其中description、config和hooks这些不在讨论中,后文会直接忽略。
b. git add:Gitcommit之前先要通过git add添加⽂文件
可以看到,多了一个index文件。并且在objects目录下多了⼀个9f的目 录,其中多了⼀个4d96d5b00d98959ea9960f069585ce42b1349a⽂ 件。其实9f4d96d5b00d98959ea9960f069585ce42b1349a就是一个Git对象,称为blob对象。
c. git commit: