mysql50道经典⾯试题_【⼤长⽂】7⼤领域,50道经典题⽬,
助你彻底搞定MySQL⾯试!...
开发⼈员必备的9⼤MySQL索引和查询优化⼀般来说,程序员的⾯试内容分为两部分,⼀部分与编程相关,另⼀部分则与数据库相关。⽽作为数据库中的主流,MySQL更是涉及⾯试中的诸多⾼频考点。对于后端⼈员来说,不需要像专业的DBA那样精通MySQL,但也需要掌握相关的基本内容。⼩编在此总结了MySQL⾯试中常见7⼤领域的50道经典⾯试题,以期帮助⼤家顺利通过⾯试。
⾸先,看看下⾯的MySQL知识树。从图中可以看出,MySQL可以从开发、优化、维护3⽅⾯来展开学习。其中,索引、锁、事务、优化等问题更是反复出现,是⾯试的重中之重。本篇⽂章就将聚焦于存储引擎、数据类型、索引、锁、事务、表结构、优化等常见的7⼤领域。
⼀、存储引擎相关
1.你知道哪些MySQL存储引擎?InnoDB。这是最常⽤的事务型存储引擎;
MyISAM。这是最常⽤的⾮事务型存储引擎,也是MySQL5.6之前的默认引擎;
MEMORY。这是⼀种易失性⾮事务型存储引擎;
ARCHIVE。这是⼀种只允许查询和新增数据⽽不允许修改的⾮事务型存储引擎;
CSV。这是以CSV格式存储的⾮事务型存储引擎;
MERGE。将多个类似的MyISAM表分组为⼀个表,可以处理⾮事务性表,默认情况下包括这些表。
EXAMPLE。可以使⽤此引擎创建表,但不能存储或获取数据。
BLACKHOLE。接受要存储的数据,但始终返回空。
FEDERATED。将数据存储在远程数据库中。
2.常见的存储引擎都适⽤于哪些场景?
使⽤哪⼀种引擎需要灵活选择,合适的存储引擎,能够提⾼整个数据库的性能。不同的存储引擎都有各⾃的特点,以适应不同的需求,如下表所⽰:
3.InnoDB和MyISAM的区别有哪些?InnoDB⽀持事物,⽽MyISAM不⽀持事物;
InnoDB⽀持⾏级锁,⽽MyISAM⽀持表级锁;
InnoDB⽀持MVCC, ⽽MyISAM不⽀持;
InnoDB⽀持外键,⽽MyISAM不⽀持;
InnoDB不⽀持全⽂索引,⽽MyISAM⽀持。
4、InnoDB和MyISAM,select count(*)哪个更快,为什么?
MyISAM更快。因为MyISAM内部维护了⼀个计数器,可以直接调取。
5、MyISAM Static和MyISAM Dynamic有什么区别?在MyISAM Static上的所有字段有固定宽度;
动态MyISAM表将具有像TEXT,BLOB等字段,以适应不同长度的数据类型;
MyISAM Static在受损情况下更容易恢复。音乐软件登录界面图片
⼆、数据类型相关
6. char和varchar的区别是什么?char是⼀个定长字段,如果申请了char(10)的空间,那么⽆论实际存储多少内容,该字段都占⽤10个字符;
varchar是变长的,也就是说申请的只是最⼤长度,占⽤的空间为实际字符长度+1;
在检索效率上来讲,char > varchar。因此在使⽤中,如果确定某个字段的值的长度,可以使⽤char,否则应该尽量使⽤varchar。例如存储⽤户MD5加密后的密码,则应该使⽤char。
7.varchar(10)和int(10)分别有什么含义?varchar的10代表了申请的空间长度,也是可以存储的数据的最⼤长度;
int的10只是代表了展⽰的长度,不⾜10位以0填充。也就是说,int(1)和int(10)所能存储的数字⼤⼩以及占⽤的空间都是相同的,只是在展⽰时按照长度展⽰⽽已。
8.MySQL的binlog有⼏种录⼊格式,它们之间有什么区别?
有三种格式:statement、row和mixed。statement模式下,记录单元为语句。即每⼀个sql造成的影响会记录。由于sql的执⾏是有上下⽂的,因此在保存的时候需要保存相关的信息,同时还有⼀些使⽤了函数之类的语句⽆法被记录复制。
mysql服务启动但是连接不了row级别下,记录单元为每⼀⾏的改动,基本是可以全部记下来但是由于很多操作,会导致⼤量⾏的改动(⽐如alter table),因此这种模式的⽂件保存的信息太多,⽇志量太⼤。
mixed, ⼀种折中的⽅案,普通操作使⽤statement记录,当⽆法使⽤statement的时候使⽤row。
9.如何在Unix和MySQL时间戳之间进⾏转换?从Unix时间戳转换为MySQL时间戳可以使⽤FROM_UNIXTIME命令
从MySQL时间戳转换为Unix时间戳可以使⽤UNIX_TIMESTAMP命令
10.怎样才能出最后⼀次插⼊时分配了哪个⾃动增量?
LAST_INSERT_ID将返回由Auto_increment分配的最后⼀个值,并且不需要指定表名称。
11.列设置为AUTO INCREMENT时,如果在表中达到最⼤值,会发⽣什么情况?
它会停⽌递增,任何进⼀步的插⼊都将产⽣错误,因为密钥已被使⽤。
12.MySQL中,如果⼀个表有⼀列定义为TIMESTAMP,则会发⽣什么?
每当⾏被更改时,时间戳字段将获取当前时间戳。
13. 如果要存储⽤户的密码散列,应该使⽤什么字段进⾏存储?
密码散列、⽤户⾝份证号等固定长度的字符串,应该使⽤char⽽不是varchar来存储,这样可以节省空间且提⾼检索效率。
编程脚本一些简单的方法三、索引相关
14. 什么是索引?
索引是⼀种数据结构,可以帮助我们快速地进⾏数据的查。
15.索引有什么优缺点?
索引的优点有:可以保证数据库表中每⼀⾏的数据的唯⼀性
可以⼤⼤加快数据的索引速度
加速表与表之间的连接,特别是在实现数据的参考完整性⽅⾯特别有意义。
在使⽤分组和排序⼦句进⾏数据检索时,同样可以显著减少查询中分组和排序的时间
通过使⽤索引,可以在时间查询的过程中,使⽤优化隐藏器,提⾼系统的性能
索引的缺点有:创建索引和维护索引要耗费时间,这种时间随着数据量的增加⽽增加
索引需要占物理空间,除了数据表占⽤数据空间之外,每⼀个索引还要占⽤⼀定的物理空间,如果需要建⽴聚簇索引,那么需要占⽤的空间会更⼤
以表中的数据进⾏增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度
16.索引的数据结构和什么有关?索引的数据结构和具体存储引擎的实现有关;在MySQL中使⽤较多的索引有Hash索引,B+树索引等。
我们经常使⽤的InnoDB存储引擎的默认索引实现为:B+树索引。
17.MySQL主要的索引类型有哪些?普通索引。是最基本的索引,它没有任何限制;
唯⼀索引。索引列的值必须唯⼀,但允许有空值。如果是组合索引,则列值的组合必须唯⼀;
主键索引。是⼀种特殊的唯⼀索引,⼀个表只能有⼀个主键,不允许有空值;
组合索引。指多个字段上创建的索引,只有在查询条件中使⽤了创建索引时的第⼀个字段,索引才会被使⽤,使⽤组合索引时遵循最左前缀集合;
全⽂索引:主要⽤来查⽂本中的关键字,⽽不是直接与索引中的值相⽐较,mysql中MyISAM⽀持全⽂索引⽽InnoDB不⽀持。
18. 在建⽴索引的时候,需要考虑哪些因素?建⽴索引的时候⼀般要考虑到字段的使⽤频率,经常作为条件进⾏查询的字段⽐较适合;
如果需要建⽴联合索引的话,还需要考虑联合索引中的顺序;
此外也要考虑其他⽅⾯,⽐如防⽌过多的所有对表造成太⼤的压⼒,这些都和实际的表结构以及查询⽅式有关。
19. Hash索引和B+树索引有什么区别?
⾸先要知道Hash索引和B+树索引的底层实现原理:hash索引底层就是hash表,进⾏查时,调⽤⼀次hash函数就可以获取到相应的键值,之后进⾏回表查询获得实际数据。
B+树底层实现是多路平衡查树。对于每⼀次的查询都是从根节点出发,查到叶⼦节点⽅可以获得所查键值,然后根据查询判断是否需要回表查询数据。
可以看出他们有以下的不同:⼀般情况下,hash索引进⾏等值查询更快,但是却⽆法进⾏范围查询。因为在hash索引中经过hash函数建⽴索引之后,索引的顺序与原顺序⽆法保持⼀致,不能⽀持范围查询。⽽B+树的的所有节点皆遵循(左节点⼩于⽗节点,右节点⼤于⽗节点,多叉树也类似),天然⽀持范围。
hash索引不⽀持使⽤索引进⾏排序,原因同上;
hash索引不⽀持模糊查询以及多列索引的最左前缀匹配。原因也是因为hash函数的不可预测。AAAA和AAAAB的索引没有相关性。boatload
hash索引任何时候都避免不了回表查询数据,⽽B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询。
hash索引虽然在等值查询上较快,但是不稳定,性能不可预测。当某个键值存在⼤量重复的时候,发
iphone app开发⽣hash碰撞,此时效率可能极差。⽽B+树的查询效率⽐较稳定,对于所有的查询都是从根节点到叶⼦节点,且树的⾼度较低。
因此,在⼤多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度,⽽不需要使⽤hash索引。
20. ⾮聚簇索引⼀定会回表查询吗?
不⼀定。这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进⾏回表查询。
举个简单的例⼦,假设我们在员⼯表的年龄上建⽴了索引,那么当进⾏select age from employee where age < 20的查询时,在索引的叶⼦节点上,已经包含了age信息,不会再次进⾏回表查询。
21. 什么是联合索引?为什么需要注意联合索引中的顺序?
MySQL可以使⽤多个字段同时建⽴⼀个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建⽴索引时的字段顺序挨个使⽤,否则⽆法命中索引。
具体原因为:
MySQL使⽤索引时需要索引有序,假设现在建⽴了"name,age,school"的联合索引,那么索引的排序为:先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进⾏排序。
当进⾏查询时,此时索引仅仅按照name严格有序,因此必须⾸先使⽤name字段进⾏等值查询,之后对于匹配到的列⽽⾔,其按照age字段严格有序,此时可以使⽤age字段⽤做索引查……因此在建⽴联合索引的时候应该注意索引列的顺序,⼀般情况下,将查询需求频繁或者字段选择性⾼的列放在前⾯。此外可以根据特例的查询或者表结构进⾏单独的调整。
22. 怎样知道语句运⾏很慢的原因?
MySQL提供了explain命令来查看语句的执⾏计划。
MySQL在执⾏某个语句之前,会将该语句过⼀遍查询优化器,之后会拿到对语句的分析,也就是执⾏计划,其中包含了许多信息。可以通过其中和索引有关的信息来分析是否命中了索引,例如possilbe_key、key、key_len等字段,分别说明了此语句可能会使⽤的索引,实际使⽤的索引以及使⽤的索引长度。
23. 为何会发⽣针对该列创建了索引但是在查询的时候并没有使⽤的问题?
在下⾯情况下,MySQL⽆法使⽤索引:使⽤不等于查询;
列参与了数学运算或者函数;
在字符串like时左边是通配符,类似于'%aaa';
当mysql分析全表扫描⽐使⽤索引快的时候不使⽤索引;
当使⽤联合索引,前⾯⼀个条件为范围查询,后⾯的即使符合最左前缀原则,也⽆法使⽤索引。
更多 索引 相关精彩内容
四、锁相关
mysql语句的执行顺序24. 你对MySQL锁是怎么理解的?
当数据库有并发事务的时候,可能会产⽣数据的不⼀致,这时候需要⼀些机制来保证访问的次序,锁机制就是这样的⼀个机制。
就像酒店的房间,如果⼤家随意进出,就会出现多⼈抢夺同⼀个房间的情况,⽽在房间上装上锁,申请到钥匙的⼈才可以⼊住并且将房间锁起来,其他⼈只有等他使⽤完毕才可以再次使⽤。
25.加锁有什么好处?
数据库是⼀个多⽤户使⽤的共享资源。当多个⽤户并发地存取数据时,在数据库中就会产⽣多个事务同时存取同⼀数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的⼀致性。
加锁是实现数据库并发控制的⼀个⾮常重要的技术。当事务在对某个数据对象进⾏操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了⼀定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进⾏更新操作。
26.Mysql中有哪⼏种锁?表级锁。开销⼩,加锁快;不会出现死锁;锁定粒度⼤,发⽣锁冲突的概率最⾼,并发度最低;
⾏级锁。开销⼤,加锁慢;会出现死锁;锁定粒度最⼩,发⽣锁冲突的概率最低,并发度也最⾼;
页⾯锁:开销和加锁时间界于表锁和⾏锁之间;会出现死锁;锁定粒度界于表锁和⾏锁之间,并发度⼀般。
27.什么是死锁?锁等待?通过数据库哪些表可以监控?死锁是指两个或多个事务在同⼀资源上互相占⽤,并请求加锁时,⽽导致的恶性循环现象。当多个事务以不同顺序试图加锁同⼀资源时,就会产⽣
死锁。
锁等待:mysql数据库中,不同session在更新同⾏数据中,会出现锁等待;
重要的三张锁的监控表innodb_trx,innodb_locks,innodb_lock_waits
28.MySQL中InnoDB引擎的⾏锁是如何实现的?InnoDB是基于索引来完成⾏锁
例如,select * from tab_with_index where id = 1 for update;for update 可以根据条件来完成⾏锁锁定,并且 id 是有索引键的列,如果 id 不是索引键那么InnoDB将完成表锁。
29.你知道哪些优化锁的⽅法?读写分离;
分段加锁;
减少锁持有的时间;
多个线程尽量以相同的顺序去获取资源;
尽可能让所有的数据检索都通过索引来完成;
合理设计索引;
尽可能减少基于范围的数据检索过滤条件;
不要将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反⽽效率不如⼀次加⼀把⼤锁。
更多 锁 相关精彩内容
五、事务相关
30. 什么是事务?
事务是⼀系列的操作,他们要符合ACID特性。
最常见的理解就是:事务中的操作要么全部成功,要么全部失败。
31. ACID是什么?
ACID,是数据库事务正确执⾏的四个基本要素的缩写。包含:原⼦性(Atomicity)、⼀致性(Consistency)、隔离性(Isolation)、持久性(Durability)。A=Atomicity,指的是原⼦。即要么全部成功,要么全部失败,不可能只执⾏⼀部分操作。
C=Consistency,指的是⼀致性。即系统(数据库)总是从⼀个⼀致性的状态转移到另⼀个⼀致性的状态,不会存在中间状态。
I=Isolation,指的是隔离性。通常来说,⼀个事务在完全提交之前,对其他事务是不可见的。
D=Durability,指的是持久性。⼀旦事务提交,那么就永远是这样⼦了,哪怕系统崩溃也不会影响结果。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论