说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了。后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和B+Tree结构,很少提到我们的集群配置优化方案。

1.索引是什么?有什么作用以及缺点

  答:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。也可以理解为索引就是一本书的目录,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚集索引那么需要的空间就会更大。

2.索引的目的是什么

  答:为了高效的查找得到我们所需要的数据,减少分组和排序时间,提高我们的mysql的性能

3.索引对数据库系统的负面影响

  答:虽然索引对于数据库的查询提高了效率,但一定程度上增加了空间的占用,同时写入的速度降低了不少,和原有写入数据相比较,多了一步去维护索引的操作。

4.建立索引的原则

  答:选择唯一性索引,为经常需要查询、排序、分组和联合操作的字段建立索引,限制索引的数目,最左前缀匹配原则(非常重要的原则),尽量选择区分度高的列作为索引,字段尽力设置不为null,索引列上不计算。

5.主键、外键和唯一索引的区别

  答:定义:

      主键:唯一标识一条记录,不能有重复的,不允许为空

      外键:表的外键是另一表的主键, 外键可以有重复的, 可以是空值

      索引:该字段没有重复值,但可以有一个空值

    作用:

      主键:用来保证数据完整性

      外键:用来和其他表建立联系用的

      索引:是提高查询排序的速度

    个数:

      主键:主键只能有一个

      外键:一个表可以有多个外键

      索引:一个表可以有多个唯一索引

6.MySQL底层实现,MySQL有什么引擎

  答:mysql底层采用B+tree的存储结构,也就是只有叶子节点携带真实数据,每个节点大小为16Kb,大致三层的B+tree就可以存2000W左右的数据,大大的减少了磁盘的IO。我们常见的存储引擎有InnoDB和MyISAM。

7.InnoDB和MyISAM区别,InnoDB替代了MyISAM,那么MyISAM是否一无是处。

  答:InnoDB支持事务,支持行锁,在磁盘上只存两个文件,一个是索引文件,另一个是数据文件,在B+Tree的主键索引上,叶子节点携带全部数据,MyISAM不支持事务,不支持行锁,磁盘上存了三个文件,一个是索引文件,另一个是数据文件,还有一个存放的对应关系文件,从查询的角度来说,InnoDB没有MyISAM的单条查询速度高,MyISAM采用Hash存储回行得到数据的查询过程,单MyISAM对于范围查询不是很友好。因此我们可以看出InnoDB用的更广一些,但同时MyISAM对于非范围查询的高效还是有很大用处的,而且MyISAM对于表内的总数查询,维护了单独的数据,也是很高效的。

8.什么是事务,事务特性

  答:事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。在我们的mysql里也是如此,也就是我们的ACID原则。A原子性,把一系列的动作视为一个最小的操作(原子操作)C一致性,从一个状态到另一个状态是一致的,I隔离性:事务与事务之间是不可见相互隔离的,D持久性:一旦事务提交,则所做修改就会被永久保存到数据库中。可以简单说一下可重复读的MVCC机制,面试官也懵圈。

9.如何设计一个高并发的系统(对于mysql来讲)

  答:这个后面会结合别的技术来说,只讲mysql不太好说。大致就是我们首先应该考虑到的是读写分离操作(过几天博客里会详细说这个),再就是我们常见的分库分表操作,水平切分垂直切分。还可以加入缓存redis操作。合理使用索引,explain进行sql优化。

10.锁的优化策略

  答:优化,也就是最小力度的锁我们的数据,也就是行锁,InnoDB的行锁其实是加在索引字段的,避免行锁的升级为表锁,再就是我们尽量避免间隙锁,尽量避免我们的范围修改,如果真的必须范围修改,那么我应该尽可能的缩小到最小的范围。

11.优化SQL的方法

  答:设置一个主键索引,需主要主键索引一般没有真正业务含义,使用int类型自动增长的,而且不能为null,非主键索引字段优先考虑区分度高的业务情况和最左前缀原则,设置为null。如果真的数据量不大,不建议加索引,反而会影响效率的。选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,使用连接(JOIN)来代替子查询,适用联合(UNION)来代替手动创建的临时表。学会使用explain进行SQL分析,实在不行可以打开trace进行分析SQL情况,用完记得关闭。

12.谈谈三大范式,什么时候使用反范式设计

  答:第一范式(1NF):确保每列保持原子性即列不可分

    第二范式(2NF):属性完全依赖于主键,也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

    第三范式(3NF):属性和主键不能间接相关(减少数据冗余,这样就可以通过主外键进行表之间连接)

  比如我们表比较多,需要关联时,但我们的A表只需要关联B表的一个字段,而且每次都需要关联查询你,这时我们可以采用A表放置一个冗余字段来存B表的那个字段。这个操作其实就是一个反范式的。

13.说几个mysql中你常用的函数答:

  答:sum、count 、avg、min、max

14.varchar(100)和varchar(200)的区别

  答:占用内存空间大小肯定是不一致的,但是占用我们磁盘的大小是一致的,我们存储字符串"abc",完全是一样的磁盘空间,但是对于varchar(100)来说,接收到的字符串长度太长了就会报错的。后面的数字代表可存储的字节数。

15.varchar(20)和int(20)中的20含义一样吗

  答:显然不一致,int(M) M表示的不是数据的最大长度,只是数据宽度,并不影响存储多少位长度的数据;varchar(M) M表示的是varchar类型数据在数据库中存储的最大长度,超过则不存;

16.如何开启慢日志查询?

  答:有2种方式,一是修改mysql的配置文件,二是通过set global语句来实现。slow_query_log = ON,打开日志,long_query_time = 2,设置时间,2秒就算是慢查询,然后重启mysql服务即可,进入mysql控制台,输入SET GLOBAL slow_query_log = 'ON';SET GLOBAL long_query_time = X;不需要重启服务就可以得到慢查询日志。

总结一下:

  只要我们熟知,我们mysql的底层是B+tree的,B+tree是什么样子的,很多面试题都是围绕这个东西来出题的,为什么不为空,空不好找B+tree的位置啊等等。再就是我们要学会使用Explain来分析sql,有的时候即使有覆盖索引,mysql也不一定去走的,他内部底层会判断走这个索引的代价。可以自行尝试。关于索引和结构的文章https://www.cnblogs.com/cxiaocai/p/11417362.html。然后就是我们的事务,也是很重要的一部分。总之不管他怎么问我们,我们真的理解了其中的原理,就算是题再怎么变化,也脱离不了底层原理的,我们要学会加法,而不是要学会1+1。

最进弄了一个公众号,小菜技术,欢迎大家的加入

 

java架构之路-(面试篇)Mysql面试大全的更多相关文章

  1. [转帖]java架构之路-(面试篇)JVM虚拟机面试大全

    java架构之路-(面试篇)JVM虚拟机面试大全 https://www.cnblogs.com/cxiaocai/p/11634918.html   下文连接比较多啊,都是我过整理的博客,很多答案都 ...

  2. java架构之路-(mysql底层原理)Mysql之让我们再深撸一次mysql

    让我再深撸一次mysql吧,这次主要以应对面试来说说mysql,大概几个方向,索引结构,查询引擎,索引优化,explain的详解和trace工具的使用. 索引: 我们先来看一下mysql的B+tree ...

  3. java架构之路-(面试篇)JVM虚拟机面试大全

    下文连接比较多啊,都是我过整理的博客,很多答案都在博客里有详细说明,理解记忆是最扎实的记忆.而且我的答案不一定是最准确的,但是我的答案不会让你失望,而且几乎每个答案都是问题的扩展答案. 1.JVM内存 ...

  4. java架构之路-(Redis专题)redis面试助力满分+

    1.Redis支持的数据类型? 答:五种,在第一节redis相关的博客我就说过,String,Hash,List,Set,zSet,也就是我们的字符串,哈希,列表,集合,有序集合五种.结构图如下. 2 ...

  5. 面试篇——mysql

    背景:在面试过程中发现很多公司对sql查询有要求,虽然不高,但是简单常见的sql查询必须熟练的掌握,否则一面都无法通过,痛定思痛,必须要深入了解下!!! 注释符号 面试题1 查询没有成绩的学生信息 参 ...

  6. java架构之路-(SpringMVC篇)SpringMVC主要流程源码解析(上)源码执行流程

    做过web项目的小伙伴,对于SpringMVC,Struts2都是在熟悉不过了,再就是我们比较古老的servlet,我们先来复习一下我们的servlet生命周期. servlet生命周期 1)初始化阶 ...

  7. java架构之路(mysql底层原理)Mysql之Explain使用详解

    上篇博客,我们详细的说明了mysql的索引存储结构,也就是我们的B+tree的变种,是一个带有双向链表的B+tree.那么我今天来详细研究一下,怎么使用索引和怎么查看索引的使用情况. 我们先来简单的建 ...

  8. java架构之路-(spring源码篇)由浅入深-spring实战详细使用

    今天我更新了一篇jvm垃圾回收的算法和垃圾回收器的内部逻辑,但是看的人不多啊......貌似大家还是比较喜欢看源码吧,毕竟实战要比理论用的多. 这篇文章不会详细的深入底层源码,只是基于注解和配置来说说 ...

  9. java架构之路-(mysql底层原理)Mysql事务隔离与MVCC

    上几篇博客我们大致讲了一下mysql的底层结构,什么B+tree,什么Hash需要回行啊,再就是讲了mysql优化的explain,这次我们来说说mysql的锁. mysql锁 锁从性能上分为乐观锁( ...

随机推荐

  1. HYSBZ - 4016 最短路径树问题 点分治 + 最短路径最小字典序

    题目传送门 题解:首先对于给定的图,需要找到那些从1好点出发然后到x号点的最短路, 如果有多条最短路就要找到字典序最小的路,这样扣完这些边之后就会有一棵树.然后再就是很普通的点分治了. 对于扣边这个问 ...

  2. Codeforces 734D. Anton and Chess(模拟)

    Anton likes to play chess. Also, he likes to do programming. That is why he decided to write the pro ...

  3. 线段树(求单结点) hdu 1556 Color the ball

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. MyBatis 传入List集合作为条件查询数据

    使用的是SSM框架,数据库是MySQL,做查询的时候传入List集合,使用SQL语句的in方式查询数据 主要有两点问题:我的List集合是利用的另外一个语句查询出来的,传入参数是int类型,返回值是i ...

  5. Java复习笔记(一):概念解释和运行步骤

    一.java的一些概念 JAVA语言分为三:java ee,java se,java me java se:  java标准版,java的核心功能所在 java ee: java企业级开发,包含ser ...

  6. 062 Python必备库-从Web解析到网络空间

    目录 一.概述 二.Python库之网络爬虫 2.1 Requests 2.2 Scrapy 2.3 pyspider 三.Python库之Web信息提取 3.1 Beautiful Soup 3.2 ...

  7. window下tomcat的下载安装和环境配置

    一.下载安装tomcat 去官网:http://tomcat.apache.org/  下载自己所需要的版本,解压在没有中文的文件夹路径下. 直接打开压缩包下面,进入bin目录,双击startup.b ...

  8. 一次搞懂建模语言UML

    Unified Modeling Language (UML)又称统一建模语言或标准建模语言,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到 ...

  9. FreeSql (一)入门

    FreeSql 是一个功能强大的对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.5+(QQ群:4336577) FreeSql采用MIT开源协议托管 ...

  10. Net基础篇_学习笔记_第十二天_面向对象继承(父类和子类)

    继承 我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父类.Student.Teacher.Driver 子类  派生类Person         ...