说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了。后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和B+Tree结构,不多提到咱们的集群配置优化方案。html
1.索引是什么?有什么做用以及缺点mysql
答:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。也能够理解为索引就是一本书的目录,建立索引和维护索引要耗费时间,这种时间随着数据量的增长而增长。索引须要占物理空间,除了数据表占数据空间以外,每个索引还要占必定的物理空间,若是要创建汇集索引那么须要的空间就会更大。面试
2.索引的目的是什么redis
答:为了高效的查找获得咱们所须要的数据,减小分组和排序时间,提升咱们的mysql的性能sql
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也不必定去走的,他内部底层会判断走这个索引的代价。能够自行尝试。关于索引和结构的文章http://www.javashuo.com/article/p-clunqwcr-k.html。而后就是咱们的事务,也是很重要的一部分。总之无论他怎么问咱们,咱们真的理解了其中的原理,就算是题再怎么变化,也脱离不了底层原理的,咱们要学会加法,而不是要学会1+1。
最进弄了一个公众号,小菜技术,欢迎你们的加入