前言本文次要受众为开发人员,所以不波及到MySQL的服务部署等操作,且内容较多,大家筹备好急躁和瓜子矿泉水.
前一阵零碎的学习了一下MySQL,也有一些实际操作教训,偶尔看到一篇和MySQL相干的面试文章,发现其中的一些问题本人也答复不好,尽管知识点大部分都晓得,然而无奈将常识串联起来.
因而决定搞一个MySQL灵魂100问,试着用答复问题的形式,让本人对知识点的了解更加深刻一点.
此文不会事无巨细的从select的用法开始解说mysql,次要针对的是开发人员须要晓得的一些MySQL的知识点,次要包含索引,事务,优化等方面,以在面试中高频的问句模式给出答案.
1. 什么是索引?
索引是一种数据结构,能够帮忙咱们疾速的进行数据的查找.
2. 索引是个什么样的数据结构呢?
索引的数据结构和具体存储引擎的实现无关, 在MySQL中应用较多的索引有Hash索引,B+树索引等,而咱们常常应用的InnoDB存储引擎的默认索引实现为:B+树索引.
3. Hash索引和B+树所有有什么区别或者说优劣呢?
首先要晓得Hash索引和B+树索引的底层实现原理:
hash索引底层就是hash表,进行查找时,调用一次hash函数就能够获取到相应的键值,之后进行回表查问取得理论数据.B+树底层实现是多路均衡查找树.对于每一次的查问都是从根节点登程,查找到叶子节点方能够取得所查键值,而后依据查问判断是否须要回表查问数据.
那么能够看出他们有以下的不同:
hash索引进行等值查问更快(个别状况下),然而却无奈进行范畴查问.因为在hash索引中通过hash函数建设索引之后,索引的程序与原程序无奈保持一致,不能反对范畴查问.而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也相似),人造反对范畴.
hash索引不反对应用索引进行排序,原理同上.hash索引不反对含糊查问以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测.AAAA和AAAAB的索引没有相关性.hash索引任何时候都防止不了回表查问数据,而B+树在合乎某些条件(聚簇索引,笼罩索引等)的时候能够只通过索引实现查问.hash索引尽管在等值查问上较快,然而不稳固.性能不可预测,当某个键值存在大量反复的时候,产生hash碰撞,此时效率可能极差.而B+树的查问效率比较稳定,对于所有的查问都是从根节点到叶子节点,且树的高度较低.因而,在大多数状况下,间接抉择B+树索引能够取得稳固且较好的查问速度.而不须要应用hash索引.
4. 下面提到了B+树在满足聚簇索引和笼罩索引的时候不须要回表查问数据,什么是聚簇索引?
在B+树的索引中,叶子节点可能存储了以后的key值,也可能存储了以后的key值以及整行的数据,这就是聚簇索引和非聚簇索引. 在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则筛选一个惟一键建设聚簇索引.如果没有惟一键,则隐式的生成一个键来建设聚簇索引.
当查问应用聚簇索引时,在对应的叶子节点,能够获取到整行数据,因而不必再次进行回表查问.
5. 非聚簇索引肯定会回表查问吗?
不肯定,这波及到查问语句所要求的字段是否全副命中了索引,如果全副命中了索引,那么就不用再进行回表查问.
举个简略的例子,假如咱们在员工表的年龄上建设了索引,那么当进行select age from employee where age < 20的查问时,在索引的叶子节点上,曾经蕴含了age信息,不会再次进行回表查问.
6. 在建设索引的时候,都有哪些须要思考的因素呢?
建设索引的时候个别要思考到字段的应用频率,常常作为条件进行查问的字段比拟适宜.如果须要建设联结索引的话,还须要思考联结索引中的程序.此外也要思考其余方面,比方避免过多的所有对表造成太大的压力.这些都和理论的表构造以及查问形式无关.
7. 联结索引是什么?为什么须要留神联结索引中的程序?
MySQL能够应用多个字段同时建设一个索引,叫做联结索引.在联结索引中,如果想要命中索引,须要依照建设索引时的字段程序挨个应用,否则无奈命中索引.
具体起因为:
MySQL应用索引时须要索引有序,假如当初建设了"name,age,school"的联结索引,那么索引的排序为: 先依照name排序,如果name雷同,则依照age排序,如果age的值也相等,则依照school进行排序.
当进行查问时,此时索引仅仅依照name严格有序,因而必须首先应用name字段进行等值查问,之后对于匹配到的列而言,其依照age字段严格有序,此时能够应用age字段用做索引查找,,,以此类推.因而在建设联结索引的时候应该留神索引列的程序,个别状况下,将查问需要频繁或者字段选择性高的列放在后面.此外能够依据特例的查问或者表构造进行独自的调整.
8. 创立的索引有没有被应用到?或者说怎么才能够晓得这条语句运行很慢的起因?
MySQL提供了explain命令来查看语句的执行打算,MySQL在执行某个语句之前,会将该语句过一遍查问优化器,之后会拿到对语句的剖析,也就是执行打算,其中蕴含了许多信息.能够通过其中和索引无关的信息来剖析是否命中了索引,例如possilbe_key,key,key_len等字段,别离阐明了此语句可能会应用的索引,理论应用的索引以及应用的索引长度.
9. 那么在哪些状况下会产生针对该列创立了索引然而在查问的时候并没有应用呢?
应用不等于查问,列参加了数学运算或者函数在字符串like时右边是通配符.相似于'%aaa'.当mysql剖析全表扫描比应用索引快的时候不应用索引.当应用联结索引,后面一个条件为范畴查问,前面的即便合乎最左前缀准则,也无奈应用索引.以上状况,MySQL无奈应用索引.
事务相干1. 什么是事务?
了解什么是事务最经典的就是转账的栗子,置信大家也都理解,这里就不再说一边了.
事务是一系列的操作,他们要合乎ACID个性.最常见的了解就是:事务中的操作要么全副胜利,要么全副失败.然而只是这样还不够的.
2. ACID是什么?能够具体说一下吗?
A=Atomicity
原子性,就是下面说的,要么全副胜利,要么全副失败.不可能只执行一部分操作.
C=Consistency
零碎(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态.
I=Isolation
隔离性: 通常来说:一个事务在齐全提交之前,对其余事务是不可见的.留神后面的通常来说加了红色,意味着有例外情况.
D=Durability
持久性,一旦事务提交,那么就永远是这样子了,哪怕零碎解体也不会影响到这个事务的后果.
3. 同时有多个事务在进行会怎么样呢?
...