关于MySQL的索引,曾经进行过一次总结,文章链接在这里Mysql索引原理及其优化.
1.什么是索引?
索引是一种数据结构,可以帮助我们快速地进行数据的查找.
2.索引是个什么样的数据结构呢?
索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引.
背景介绍
我的工作是python服务器开发工程师,最近准备看看其他工作机会,也面试了一些公司。MySQL基本是一定会被问到的知识点,所以最近又开始恶补相关的知识点。面试过程中越来越觉得面试官真的很重要,他是面试者了解公司最直接的一个途径,也是公司技术的把关者。所以我也在思考一个问题,假如我是面试官我会怎么考察面试者?
面试的宗旨
首先面试最本质的目的是招收合理的人来工作,所以应该要避免的问题是“面试内容是造火箭,结果工作内容却是搬砖”。所以要问的问题最好是贴近生产环境的。其次面试通常会涉及很多概念,工作比较久的同学通常容易忘记这些东西。所以我觉得没有必要考察概念,而是考察这些概念的本质,这些本质的东西是不容易忘记的。
这里说明一下,通常业务中用得最多的是Innodb,所以以下问题都是基于Innodb的。
问题一:考察数据隔离和事务
第一阶段:
MySQL的隔离级别有如下四种,默认的级别是什么?
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
REPEATABLE-READ。这个应该是常识,大家都知道的。这里需要让面试者解释一下隔离级别的意义,因为后面的问题是基于这个概念的。如果面试者忘了概念建议提示一下,继续下一个问题。
READ-UNCOMMITTED:表示可以读取到未提交的数据
READ-COMMITTED:可以读取到已经提交的数据
REPEATABLE-READ:可重复读,每次读取的结果都是一样的。
SERIALIZABLE完全串行化的读,每次读都需要获得共享锁,读写相互都会阻塞
这里很多面试官会问一个REPEATABLE-READ怎么解决幻读的问题。当时有点蒙,“幻读”是什么东西。其实本质上很简单,幻读其实就是MySQL怎么确保“可重复读”这个功能的。具体的名词叫数据多版本并发控制(MVCC)。不过这个应该是比较底层的知识,属于Nicetohave了。
第二阶段
有一张表user_count,这个表记录的是不同国家用户的个数。现在如下代码会在以上四个级别的隔离中分别执行一次,请问结果分别是什么?注意,以下代码是在个线程中执行的,所以是并发执行的。
数据样例:
+--------+--------+
region
number
us
0
cn
0
代码:
dec_multi_thread_run()
defdo():
try:
#getoldnumfromtable
num="selectnumberfromuser_countwhereregion=cn"
#updatetonewvalue
"updateuser_countsetnumber=%swhereregion=cn"%(num+1)
except:
rollback()
else: