数据结构论坛

首页 » 分类 » 问答 » 程序员的MySQL水平如何体现出来
TUhjnbcbe - 2023/7/13 20:22:00

关于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:

1
查看完整版本: 程序员的MySQL水平如何体现出来