面试大厂前先搞定这些常问的MySQL面试题

一、事物的并发?事物隔离级别,每一个级别会引起什么问题?MySQL默认是哪一个级别?

事物应该彼此彻底隔离,以免并发事物所致使的问题,然而,那样会对性能产生极大的影响,由于事物必须按顺序运行,在实际开发中,为了提高性能,事物会以较低的隔离级别运行,事物隔离级别能够经过隔离事物属性指定。laravel

事物的并发问题面试

1)脏读:事务A读取了事务B更新的数据,而后B回滚操做,那么A读取到的数据是脏数据。算法

2)不可重复读:事务A屡次读取同一数据,事务B在事务A屡次读取的过程当中,对数据做了更新并提交,致使事务A屡次读取同一数据时,结果所以本事务 前后两次读到的数据结果会不一致。sql

3)幻读:幻读解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。shell

事物隔离级别数据库

1)读未提交:另外一个事务修改了数据,但还没有提交,而本事务中的SELECT会读到这些未被提交的数据脏读。数组

2)不可重复读:事务A屡次读取同一数据,事务B在事务A屡次读取的过程当中,对数据做了更新并提交,致使事务A屡次读取同一数据时,结果所以本 事务前后两次读到的数据结果会不一致。缓存

3)可重复读:在同一个事务里,SELECT的结果是事务开始时时间点的状态,所以,一样的SELECT操做读到的结果会是一致的。可是,会有幻读现象。安全

4)串行化:最高的隔离级别,在这个隔离级别下,不会产生任何异常。并发的事务,就像事务是在一个个按照顺序执行同样。服务器

MySQL默认的事务隔离级别为repeatable-read。

二、MySQL存储引擎MylSAM与InnoDB的区别点有哪些?

1)InnoDB支持事务,MylSAM不支持,这一点是很是之重要。事务是一种高级 的处理方式,如在一些列増删改中只要哪一个岀错还能够回滚还原,而MylSAM 就不能够了。

2)MylSAM适合查询以及插入为主的应用。InnoDB适合频繁修改以及涉殛安全性较高的应用。

3)InnoDB支持外键,MylSAM不支持。

4)从MySQL5.5.5之后,InnoDB是默认引擎。

5)InnoDB不支持FULLTEXT类型的索引。

6)InnoDB 中不保存表的行数,如 selectcount(*)fromtable 时,InnoDB 须要 扫描一遍整个表来计算有多少行,可是MylSAM只要简单的读岀保存好的行数便可。注意的是,当count(*)语句包含where条件时MylSAM也须要扫描 整个表。

7)对于自増长的字段,InnoDB中必须包含只有该字段的索引,可是在MylSAM 表中能够和其余字段一块儿创建联合索引。

8)DELETE FROM TABLE时,InnoDB不会从新创建表,而是一行一行的删除,效率很是慢。MylSAM则会重建表。

9)InnoDB支持行锁(某些状况下仍是锁整表,如update table set a=1 where user like %lee%’。

三、什么是临时表?临时表何时删除?

1)临时表能够手动删除:DROP TEMPORARY TABLE IF EXISTS temp_tb;

2)临时表只在当前链接可见,当关闭链接时,MySQL会自动删除表并释放全部空 间。所以在不一样的链接中能够建立同名的临时表,而且操做属于本链接的临时表。

3)建立临时表的语法与建立表语法相似,不一样之处是増加关键字TEMPORARY, 如:

CREATE TEMPORARY TABLE tmp\_table (

NAME VARCHAR (10) NOTNULL,

time date NOT NULL

select \* from tmp\_table;

四、关于MySQL数据库提供的两种存储引擎,MylSAM与InnoDB如何选?

1)INNODB会支持一些关系数据库的高级功能,如事务功能和行级锁,MylSAM不支持。

2)MylSAM的性能更优,占用的存储空间少,因此,选择何种存储引擎,视具体应用而定。

3)若是你的应用程序必定要使用事务,毫无疑问你要选择INNODB引擎。但要注意,INNODB的行级锁是有条件的。在where条件没有使用主键时,照样会锁全表。好比DELETE FROM mytable这样的删除语句。

4)若是你的应用程序对查询性能要求较高,就要使用MylSAM了。MylSAM索 引和数据是分开的,并且其索引是压缩的,能够更好地利用内存。因此它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。MylSAM拥有全文索引的功能,这能够极大地优化LIKE查询的效率。

五、MySQL B+Tree索引和Hash索引的区别?

1)Hash索引结构的特殊性,其检索效率很是高,索引的检索能够一次定位;

2)B+树索引须要从根节点到枝节点,最后才能访问到页节点这样屡次的IO访冋;

注:BAT面试常问,为何不用Hash索引而还要使用B+树索引呢?

Hash索引

1)Hash索引仅仅能知足"=",“IN”和”"查询,不能使用范围查询,由于通过相应 的Hash算法处理以后的Hash值的大小关系,并不能保证和Hash运算前彻底—样;

2)Hash索引没法被用来避免数据的排序操做,由于Hash值的大小关系并不必定和Hash运算前的键值彻底同样;

3)Hash索引不能利用部分索引键查询,对于组合索引,Hash索引在计算Hash 值的时候是组合索引键合并后再一块儿计算Hash值,而不是单独计算Hash 值,因此经过组合索引的前面一个或几个索引键进行查询的时候,Hash索引也没法被利用;

4)Hash索引在任什么时候候都不能避免表扫描,因为不一样索引键存在相同Hash 值,因此即便取知足某个Hash键值的数据的记录条数,也没法从Hash索引中直接完成查询,仍是要回表查询数据;

5)Hash索引遇到大量Hash值相等的状况后性能并不必定就会比B+树索引高。存储Hash冲突

B+Tree索引:

1)MySQL中,只有HEAP/MEMORY引擎才显示支持Hash索引。

2)经常使用的InnoDB引擎中默认使用的是B+树索引,它会实时监控表上索引的使用情 况,若是认为创建哈希索引能够提升查询效率,则自动在内存中的“自适应哈希索 引缓冲区”创建哈希索引(在InnoDB中默认开启自适应哈希索引),经过观察搜 索模式,MySQL会利用index key的前缀创建哈希索引,若是一个表几乎大部分都 在缓冲池中,那么创建一个哈希索引可以加快等值查询

B+树索引和哈希索引的明显区别是:

1)若是是等值查询,那么哈希索引明显有绝对优点,由于只须要通过一次算法 便可找到相应的键值;这个前提是,键值都是惟一的。若是键值不是惟一的,就须要先找到该撻所在位置,而后再根据S表日后扫描,直到找到相应 的麴居;

若是是范围查询检索,这时候哈希素引就毫无用武之地了,由于原先是有序的键值,通过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成 范围查询检索;

2)哈希索引没办法利用索引完成排序,以及like,xxx%,这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);

3)哈希索引也不支持多列联合索引的最左匹配规则;

4)B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值状况下,哈希索引的效率也是极低的,由于存在所谓的哈希碰撞问 题。

5)在大多数场景下,都会有范围查询、排序、分组等查询特征,用B+树索引就能够了

六、汇集索引和非汇集索引区别?

根本区别

汇集索引和非汇集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。

汇集索引

1)汇集索引表记录的排列顺序和索引的排列顺序一致(因此查询效率快,只要找到第一个索引值记录,其他就连续性的记录在物理也同样连续存放。汇集索引对应 的缺点就是修改慢,由于为了保证表中记录的物理和索引顺序一致,在记录插入 的时候,会对数据页从新排序。

2)汇集索引相似于新华字典中用拼音去查找汉字,拼音检索表于书记顺序都是按照 a~z排列的,就像相同的逻辑顺序于物理顺序同样,

非汇集索引

1)非汇集索引制定了表中记录的逻辑顺序,可是记录的物理和索引不必定一致,两种索引都采用B+树结构,非汇集索引的叶子层并不和实际数据页相重叠,而采用 叶子层包含一个指向表中的记录在数据页中的指针方式。非汇集索引层次多,不会形成数据重排。非汇集索引相似在新华字典上经过偏旁部首来查询汉字,检索表也许是按照横、 竖、撇来排列的,可是因为正文中是a~z的拼音顺序,因此就相似于逻辑地址于物理地址的不对应。

2)适用的状况就在于分组,大数目的不一样值,频繁更新的列中,这些状况即不适合汇集索引。

七、MySQL慢查寻怎么解决?

1)slowquerylog慢查询开启状态。

2)slowquerylog_file慢查询日志存放的位置(这个目录须要MySQL的运行账 号的可写权限,_般设置为MySQL的数据存放目录)。

3)longquerytime查询超过多少秒才记录。

八、MySQL高并发环境解决方案有哪些?

1)分库分表:水平分库分表,由单点分布到多点数据库中,从而下降单点数据 库压力。

2)集群方案:解决DB宕机带来的单点DB不能访问问题。

3)读写分离策略:极大限度提升了应用中Read数据的速度和并发量。没法解决高写入压力。

阿里面试

九、从innodb的索引结构分析,为何索引的key长度不能太长?

key太长会致使一个页当中可以存放的key的数目变少,间接致使索引树的页数目变多,索引层次増加,从而影响总体查询变动的效率。

十、MySQL的数据如何恢复到任意时间点?

恢复到任意时间点以定时的作全量备份,以及备份増量的binlog 日志为前提。恢 复到任意时间点首先将全量备份恢复以后,再此基础上回放増加的binlog直至指定的时间点。

腾讯面试

十一、MYSQL的主从延迟怎么解决。

1)半同步复制

从MySQL5.5开始,MySQL已经支持半同步复制了,半同步复制介于异步复制和同步复制之间,主库在执行完事务后不马上返回结果给客户端,须要等待至少一个 从库接收到并写到relay log中才返回结果给客户端。相对于异步复制,半同步复 制提升了数据的安全性,同时它也形成了一个TCP/IP往返耗时的延迟。

2)主库配置syncbinlog=1 ,innodbflushlogattrxcommit=1

syncbinlog的默认值是0, MySQL不会将binlog同步到磁盘,其值表示每写多少binlog同步一次磁盘,

innodbflushlogattzxcommit为1表示每一次事务提交或事务外南指令都须要把日志 flush到磁盘。

3)优化网络。升级Slave硬件配置。升级5.7釆用并行复制

十二、某个表有近千万数据,CRUD比较漫,如何优化?

1)能够作表拆分,减小单表字段数量,优化表结构。

2)在保证主键有效的状况下,检查主键索引的字段顺序,使得查询语句中条件的 字段顺序和主键索引的字段顺序保持一致。

3)在单表的条件下,SQL语句、行索引优化等,从而提高数据的检索速度。

1三、高并发下,如何作到安全的修改同一行数据?

1)悲观锁

2)FIFO (First Input First Output,先进先岀)缓存队列思路

3)使用乐观锁

百度面试

1四、关系数据库釆用的数据结构是什么类型的数据结构?

1)数据库的数据结构有:非线性数据结构、树形数据结构,集合数据结构

2)数据结构釆用二维表(非线性数据结构)存储。

3)二维表与关系

  • 关系-二维表;
  • 元组-二维表中的行
  • 份量-二维表中的列

4)B+Tree索引–树形数据结构 Hash索引–集合数据结构

注:四种基本的数据结构。线性数据结构(元素之间一对一的关系)结 构又细分为,数组,链表,队列,堆栈。),树形数据结构(好比二叉树,平衡二叉树,B+树),集合数据结构,图形数据结构

1五、数据库的索引的实现?

1)数据的索引实现为B+Tree、hash索引结构存储数据。

2)B+Tree是一种多路平衡查询树,因此他的节点是自然有序的(左子节点小于父 节点、父节点小于右子节点),因此对于范围查询的时候不须要作全表扫描。

3)Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,因此多个数据在存储关系上是彻底没有任何顺序关系的。

以上内容但愿帮助到你们, 不少PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提高,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货须要的能够免费分享给你们 ,须要戳这里     PHP进阶架构师>>>实战视频、大厂面试文档免费获取

相关文章
相关标签/搜索