热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大厂面试之MySQL终极八股

1.数据库和数据库管理系统区别数据库是指数据集合,数据库管理系统是指管理数据的系统,例如MySQL、Oracle等。2.ER图的作用ER图用于描述数据库

1.数据库和数据库管理系统区别


  • 数据库是指数据集合,数据库管理系统是指管理数据的系统,例如MySQL、Oracle等。


2.ER图的作用


  • ER图用于描述数据库的需求分析进行概念化,概念设计的产物。


3.存储过程是啥?


  • 存储过程是指将常用的sql语句进行预编译,下次进行执行的时候速率快。


4.delete、drop、truncate之间的区别


  • 1.delete是DML,删除表的表项,支持回滚。
  • 2.drop是删除表和表结构、
  • 3.truncate是清空表的数据,不删除表的结构。


5. 介绍一下MySQL中的字符集和编码


  • 1.原本计算机中只要ASCII字符集,只存储着英文字母和一标点符号。
  • 2.GBK字符集,存储着全国的大部分文字,包括中文,但是不全。
  • 3.Unicode字符集:存储所有的文字的集合,是按照二进制的方式进行存储的。
  • 4.编码:因为Unicode是按照二进制的方式进行存储的,所以如何进行编码也是很关键的。1.UTF-8编码,英文和符号按照1字节、中文按照3个字节进行编码。2.UTF-8mb4编码,在UTF-8的基础上面增加了四字节编码中文的繁体字和emoji表情。


6.MySQL中的存储引擎


6.1 MyISAM

  • MySQL5.5之前的存储引擎,只有表锁,不支持外键,不支持行锁,不支持系统宕机恢复,不支持事务,是非聚集索引。

6.2 InnoDB

  • MySQL5.5及其以后的默认存储引擎,支持行锁,支持事务,支持宕机恢复(引入了redo log),支持外键。


7.MySQL中锁


7.1 悲观锁和乐观锁

  • 悲观锁:以预防的思想对数据进行操作之前会加锁,其他用户无法进行操作,操作完之后进行解锁。
    手动加悲观锁:
    读锁LOCK tables 数据库表read释放锁UNLOCK TABLES; 写锁:LOCK tables test_db WRITE释放锁UNLOCK TABLES;
    分类:全局锁、表锁、行锁、间隙锁、临键锁
    在这里插入图片描述
  • 乐观锁:是对数据冲突保持一种热观的态度,操作数据的时候不会进行加锁,可以并行的处理数据,只要数据的提交的时候通过版本的比较验证数据时候冲突。
    在这里插入图片描述

7.2 读锁和写锁

  • 读锁:共享锁称之为读锁,事务A对数据加读锁了,其他事务只能对该数据加读锁,都只能进行读操作,一个数据上可以由多个事务加读锁,等到该数据上所有读锁全部释放之后才可以加写锁。语法:SELECT … LOCK IN SHARE MODE;
  • 写锁:排他锁也称之为写锁,事务A对数据加写锁,既可以读取也可以进行修改数据,其他事务不可以加任何锁,直到A事务释放。SELECT … FOR UPDATE。

7.3全局锁

  • 作用:按照只读的方式锁住数据库。在数据库备份的时候或者数据库同步的时候可以使用。

7.4表锁

  • 加锁:lock table tableName read/write; 解锁:unlock table:

7.5意向锁

  • 意向锁,innodb特有,加在表级别上的锁,意向锁是InnoDB自动加的,不需要用户干预。
  • 意向共享锁(IS):对表进行增删改查的时候,需要加一个读共享锁,表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁。
  • 意向排他锁(IX):对表结构进行修改的时候,需要加一个写意向锁,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。
  • mysql InnoDB锁兼容阵列
    在这里插入图片描述
  • 作用:
    1.防止DDL和DML之间产生冲突(MDL的(增查改删)读锁和 DDL之间不互斥;MDL的写锁和DDL的写锁修改表结构之间互斥;在对表结构进行修改时,加MDL锁,另外线程只能等待。)
    2.提高锁的效率。(加了意向锁之后可以避免加行锁的时候进行全表扫描)

7.6行锁

  • 行锁是基于索引实现的,所以没有建立索引的更新将会扫描全表,使用的是表锁;通过锁住索引实现行及锁。如果select …for update没走索引,就会锁表,innodb内部是全表根据主键索引逐行扫描,逐行加锁,最后统一释放。
  • 行锁是需要的时候加上的,不是不需要了就立即释放,在commit后才释放,释放时机如下:1. 执行commit语句或者rollback;2. 退出数据库;3. 客户端断开连接;

7.7 三种细粒度锁的实现

  • Record lock:记录锁,单个行记录上的锁,实现:通过索引实现,锁住一行记录,锁粒度最小,并发度高。使用条件:等值查询;
  • Gap lock:间隙锁,锁定一个范围,不包括记录本身,使用条件:查询一个不存在的值,锁定就是该值左右的区间,就是间隙锁。间隙锁与间隙锁之间是不冲突的,跟间隙锁冲突的是: 往间隙之间插入一条数据的这个操作 。
  • Next-key lock:record+gap 临键锁,锁定一个范围,包含记录本身.使用条件:范围查询,包含等值和区间锁住的是下一个记录的左开右闭的区间;解决了RR级别下的数据幻读;
    在这里插入图片描述

7.8MySQL如何解决幻读

  • 幻读产生:一个事务在读取的时候,读取到数据使得用户觉得产生了幻觉一样,根据原因是锁住了行,但是新增数据被事务读到依然会产生幻觉。
  • 解决办法:在RR的基础上+Next Key Lock。


8.MySQL中的缓存


  • MySQL在8.0版本之前存在缓存的功能,缓存的是SQl语句,当查询过来的时候,会直接查缓存,命中的话直接返回。


9.一席话讲给面试官什么叫事务


  • 1.事务是指一个SQL操作集合,这个集合要么全部执行,要不全部都不执行,满足用户逻辑和物理的一致性。
  • 2.数据库的特性:原子性:原子性是指事务包含的sql语句集要么全部执行,要么全部都不执行,原子性是由undo log来保证的,undo log记录数据修改之前的旧值,当事务进行回滚的时候,数据可以恢复到原来的旧值。隔离性·:事务与事务之间如果对同一数据进行操作的话,会造成一系列的问题:比如脏读,不可重复读,幻读等问题。所以事务与事务之间应该存在隔离,隔离级别有:读未提交,读已提交,可重复读,可串行化读,隔离级别是基于MVVC来实现的。事务隔离界别等下在谈。持久性:是指数据库可以及时更新到磁盘中,数据库宕机恢复,持久性是基于redo log来实现的,是InnoDB特有的,会记录数据改变后的新值,当重启宕机的数据库会将redo log修改值进行持久化到磁盘中。一致性:一致性是MySQL事务的目的,其他三个条件是基础,满足用户的逻辑和物理要达到一致性。
  • 3.事务的隔离级别:1.读未提交,一个事务可以读到另一个事务未提交的内容,会造成脏读、不可重复度、幻读等问题。2.读已提交,一个事务可以读取另一个事务提交的内容,会造成一个事务中多次读取同一个数据不同结果,采用MVVC多版本并发控制实现的,每次读都会读取最新的版本。3.可重复读,事务在读取的过程中始终读取最开始的版本数据,可以解决可重复读的问题,但是会存在幻读的问题,可重复读只能锁住单个记录,若要解决幻读,需要加上Next Key Lock就能保证解决幻读。


10.时间选择timestamp、datetime和时间戳


  • DATETIME:范围大,但是时区需要指定。
  • TIMESTAMP:范围小,自动时区。
  • 时间戳:存储long类型,没有时区的文体,但是需要转换。


11.主键索引和非主键索引


  • 索引存在的意义:索引的存在是为了加快检索的速度,索引的结构采用B+树实现的。
  • 为什么要用B+树当做存储结构:B+树高度比较低,宽度比较宽,从而IO的次数就会少,加快检索效率。
  • 主键索引:主键索引的存储结构是用聚集所用,叶子结点包含一行的所有数据。
  • 非主键索引:采用的非聚集索引,叶子结点包含索引值+主键,可能会要回表查询,尽量采用覆盖查询避免进行回表。


12.MySQL中的三大日志


12.1 undo log

  • undo log是MySQL事务原子性的基础,undo log保存了数据修改前的旧值,当事务进行回滚的时候则回到事务执行之前的状态。

12.2 binlog

  • binlog是基于快照的,记录的是service层的修改记录,用于数据库的主主、主从一致性。

12.3 redo log

  • redo log是事务持久化的保证,redo log中保存着数据的修改,保存着修改记录,和binlog不同。


推荐阅读
  • 程序员学习数据库安装教程中必会MySQL使用规范手册
    一个平台或系统随着时间的推移和用户量的增多,数据库操作往往会变慢;而在Java应用开发中数据库更是尤为重要,绝大多数情况下数据库的性能决定 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • kafka教程基本概念
    kafka教程基本概念 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 搭建线上服务器环境,分享一下我安装MySql的步骤,也替大家踩踩坑!一、检查服务器是否已经安装MySqlrpm-qa|grepmysql如 ... [详细]
  • ZendCache:让网站飞起来
    php教程|php手册zend,ZendCache,PHP,Cache,comphp教程-php手册对商业网站来说,效率是十分重要的。在一些电子商务的站点上,服务器的响应速度决定了 ... [详细]
  • 一、问题背景爬虫采集来的文件名中含有emoji以及全角半角符号,但是采集时并没有处理,原封不动存储到了数据中。现在有个需求,从数据库中取出数据,发送跟客户端,客户端拿这文件名写入到 ... [详细]
  • 之前说过怎么生成,可以参考这里可以一键生成entity、service、repository类了。这个是对生成的内容进行扩展,在写一些基础、公共的组件时 ... [详细]
  • MySQL千万级数据的大表优化解决方案【mysql特性】
    mysql数据库中的表数据量几千万后,查询速度会很慢,日常各种卡慢,严重影响使用体验。在考虑升级数据库或者换用大数据解决方案前,必须优化现有mysql数据库 ... [详细]
  • GC日志打印信息:-XX:PrintGCTimeStamps输出格式:289.556:[GC[PSYoungGen:314113K-15937K(30 ... [详细]
  • 带你把MySQL索引吃透了
    数据库|mysql教程mysql数据库-mysql教程支付宝网页支付源码,ubuntu脑图,tomcat显示默认主页,爬虫听书软件,php可以开发什么软件,天津关键词seo排名优化 ... [详细]
author-avatar
行侠客人生_983
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有