28道MySQL常见面试题,之后面试不再怕问MySQL了!

问题1:char、varchar的区别是什么?

varchar是变长而char的长度是固定的。若是你的内容是固定大小的,你会获得更好的性能。

问题2: TRUNCATE和DELETE的区别是什么?

DELETE命令从一个表中删除某一行,或多行,TRUNCATE命令永久地从表中删除每一行。

问题3:什么是触发器,MySQL中都有哪些触发器?

触发器是指一段代码,当触发某个事件时,自动执行这些代码。在MySQL数据库中有以下六种触发器:1.Before Insert2.After Insert3.Before Update4.After Update5.Before Delete6.After Delete

问题4:FLOAT和DOUBLE的区别是什么?

  • FLOAT类型数据能够存储至多8位十进制数,并在内存中占4字节。
  • DOUBLE类型数据能够存储至多18位十进制数,并在内存中占8字节。

问题5:如何在MySQL种获取当前日期?

MySQL的这28道常见面试题,看你会不会!

问题6:如何查询第n高的工资?

MySQL的这28道常见面试题,看你会不会!

问题7:请写出下面MySQL数据类型表达的意义(int(0)、char(16)、varchar(16)、datetime、text)

int(0)表示数据是INT类型,长度是0、char(16)表示固定长度字符串,长度为1六、varchar(16)表示可变长度字符串,长度为1六、datetime表示时间类型、text表示字符串类型,能存储大字符串,最多存储65535字节数据)

问题8:请说明InnoDB和MyISAM的区别

  1. InnoDB支持事务,MyISAM不支持;
  2. InnoDB数据存储在共享表空间,MyISAM数据存储在文件中;
  3. InnoDB支持行级锁,MyISAM只支持表锁;
  4. InnoDB支持崩溃后的恢复,MyISAM不支持;
  5. InnoDB支持外键,MyISAM不支持;
  6. InnoDB不支持全文索引,MyISAM支持全文索引;

问题9:innodb引擎的特性

一、插入缓冲(insert buffer)二、二次写(double write)三、自适应哈希索引(ahi)四、预读(read ahead)

问题10:请列举3个以上表引擎

InnoDB、MyISAM、Memory

问题11:请说明varchar和text的区别

  1. varchar可指定字符数,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
  2. text类型不能有默认值。
  3. varchar可直接建立索引,text建立索引要指定前多少个字符。varchar查询速度快于text,在都建立索引的状况下,text的索引几乎不起做用。
  4. 查询text须要建立临时表。

问题12:varchar(50)中50的含义

最多存放50个字符,varchar(50)和(200)存储hello所占空间同样,但后者在排序时会消耗更多内存,由于order by col采用fixed_length计算col长度(memory引擎也同样)。

问题13:int(20)中20的含义

是指显示字符的长度,不影响内部存储,只是当定义了ZEROFILL时,前面补多少个 0

问题14:简单描述MySQL中,索引,主键,惟一索引,联合索引的区别,对数据库的性能有什么影响?

  • 一个表只能有一个主键索引,可是能够有多个惟一索引。
  • 主键索引必定是惟一索引,惟一索引不是主键索引。
  • 主键能够与外键构成参照完整性约束,防止数据不一致。
  • 联合索引:将多个列组合在一块儿建立索引,能够覆盖多个列。(也叫复合索引,组合索引)
  • 外键索引:只有InnoDB类型的表才可使用外键索引,保证数据的一致性、完整性、和实现级联操做(基本不用)。
  • 全文索引:MySQL自带的全文索引只能用于MyISAM,而且只能对英文进行全文检索 (基本不用)

问题15:建立MySQL联合索引应该注意什么?

需遵循前缀原则

问题16:列值为NULL时,查询是否会用到索引?

在MySQL里NULL值的列也是走索引的。固然,若是计划对列进行索引,就要尽可能避免把它设置为可空,MySQL难以优化引用了可空列的查询,它会使索引、索引统计和值更加复杂。

问题17:如下语句是否会应用索引:SELECT FROM users WHERE YEAR(adddate) < 2019;*

不会,由于只要列涉及到运算,MySQL就不会使用索引。

问题18:MyISAM索引实现?

MyISAM存储引擎使用B+Tree做为索引结构,叶节点的data域存放的是数据记录的地址。MyISAM的索引方式也叫作非聚簇索引的,之因此这么称呼是为了与InnoDB的聚簇索引区分。

问题19:MyISAM索引与InnoDB索引的区别?

  1. InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
  2. InnoDB的主键索引的叶子节点存储着行数据,所以主键索引很是高效。
  3. MyISAM索引的叶子节点存储的是行数据地址,须要再寻址一次才能获得数据。
  4. InnoDB非主键索引的叶子节点存储的是主键和其余带索引的列数据,所以查询时作到覆盖索引会很是高效。

问题20:有A(id,sex,par,c1,c2),B(id,age,c1,c2)两张表,其中A.id与B.id关联,如今要求写出一条SQL语句,将B中age>50的记录的c1,c2更新到A表中同一记录中的c1,c2字段中

MySQL的这28道常见面试题,看你会不会!

问题21 :MySQL的关联查询语句你会那些?

六种关联查询1.交叉链接(CROSS JOIN)2.内链接(INNER JOIN)3.外链接(LEFT JOIN/RIGHT JOIN)4.联合查询(UNION与UNION ALL)5.全链接(FULL JOIN)6.交叉链接(CROSS JOIN)
MySQL的这28道常见面试题,看你会不会!

内链接分为三类面试

  1. 等值链接:ON A.id=B.id
  2. 不等值链接:ON A.id > B.id
  3. 自链接:SELECT * FROM A T1 INNER JOIN A T2 ON T1.id=T2.pid

外链接(LEFT JOIN/RIGHT JOIN)sql

  1. 左外链接:LEFT OUTER JOIN, 以左表为主,先查询出左表,按照ON后的关联条件匹配右表,没有匹配到的用NULL填充,能够简写成LEFT JOIN
  2. 右外链接:RIGHT OUTER JOIN, 以右表为主,先查询出右表,按照ON后的关联条件匹配左表,没有匹配到的用NULL填充,能够简写成RIGHT JOIN

联合查询(UNION与UNION ALL)数据库

MySQL的这28道常见面试题,看你会不会!

  1. 就是把多个结果集集中在一块儿,UNION前的结果为基准,须要注意的是联合查询的列数要相等,相同的记录行会合并
  2. 若是使用UNION ALL,不会合并重复的记录行3.效率 UNION 高于 UNION ALL

全链接(FULL JOIN)缓存

1.MySQL不支持全链接2.可使用LEFT JOIN 和UNION和RIGHT JOIN联合使用
MySQL的这28道常见面试题,看你会不会!

嵌套查询服务器

用一条SQL语句得结果做为另一条SQL语句得条件,效率很差把握
MySQL的这28道常见面试题,看你会不会!

解题方法函数

根据考题要搞清楚表的结果和多表之间的关系,根据想要的结果思考使用那种关联方式,一般把要查询的列先写出来,而后分析这些列都属于哪些表,才考虑使用关联查询

问题22:UNION与UNION ALL的区别?

  1. 若是使用UNION ALL,不会合并重复的记录行
  2. 效率 UNION 高于 UNION ALL

问题23:一个6亿的表a,一个3亿的表b,经过外键tid关联,你如何最快的查询出知足条件的第50000到第50200中的这200条数据记录。

1.若是A表TID是自增加,而且是连续的,B表的ID为索引工具

MySQL的这28道常见面试题,看你会不会!

2.若是A表的TID不是连续的,那么就须要使用覆盖索引.TID要么是主键,要么是辅助索引,B表ID也须要有索引。性能

MySQL的这28道常见面试题,看你会不会!

问题24:拷贝表( 拷贝数据, 源表名:a 目标表名:b)

MySQL的这28道常见面试题,看你会不会!

问题25:Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 查询没学过“叶平”老师课的同窗的学号、姓名

MySQL的这28道常见面试题,看你会不会!

问题26:随机取出10条数据

MySQL的这28道常见面试题,看你会不会!

问题27:请简述项目中优化SQL语句执行效率的方法,从哪些方面,SQL语句性能如何分析?

考点分析:优化

这道题主要考察的是查找分析SQL语句查询速度慢的方法

延伸考点:spa

  1. 优化查询过程当中的数据访问
  2. 优化长难的查询语句
  3. 优化特定类型的查询语句

如何查找查询速度慢的缘由

记录慢查询日志,分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和精力,可使用pt-query-digest工具进行分析

使用show profile

MySQL的这28道常见面试题,看你会不会!

使用show status

show status会返回一些计数器,show global status会查看全部服务器级别的全部计数有时根据这些计数,能够推测出哪些操做代价较高或者消耗时间多

show processlist

观察是否有大量线程处于不正常的状态或特征

MySQL的这28道常见面试题,看你会不会!

最常问的MySQL面试题五——每一个开发人员都应该知道

使用explain

分析单条SQL语句

MySQL的这28道常见面试题,看你会不会!

优化查询过程当中的数据访问

  1. 访问数据太多致使查询性能降低
  2. 肯定应用程序是否在检索大量超过须要的数据,多是太多行或列
  3. 确认MySQL服务器是否在分析大量没必要要的数据行
  4. 避免犯以下SQL语句错误
  5. 查询不须要的数据。解决办法:使用limit解决
  6. 多表关联返回所有列。解决办法:指定列名
  7. 老是返回所有列。解决办法:避免使用SELECT *
  8. 重复查询相同的数据。解决办法:能够缓存数据,下次直接读取缓存
  9. 是否在扫描额外的记录。解决办法:使用explain进行分析,若是发现查询须要扫描大量的数据,但只返回少数的行,能够经过以下技巧去优化:
  • 使用索引覆盖扫描,把全部的列都放到索引中,这样存储引擎不须要回表获取对应行就能够返回结果。
  • 改变数据库和表的结构,修改数据表范式
  • 重写SQL语句,让优化器能够以更优的方式执行查询。

优化长难的查询语句

  1. 一个复杂查询仍是多个简单查询
  2. MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多使用尽量小的查询是好的,可是有时将一个大的查询分解为多个小的查询是颇有必要的。
  3. 切分查询
  4. 将一个大的查询分为多个小的相同的查询
  5. 一次性删除1000万的数据要比一次删除1万,暂停一会的方案更加损耗服务器开销。
  6. 分解关联查询,让缓存的效率更高。
  7. 执行单个查询能够减小锁的竞争。
  8. 在应用层作关联更容易对数据库进行拆分。
  9. 查询效率会有大幅提高。
  10. 较少冗余记录的查询。

优化特定类型的查询语句

  1. count(*)会忽略全部的列,直接统计全部列数,不要使用count(列名)
  2. MyISAM中,没有任何where条件的count(*)很是快。
  3. 当有where条件时,MyISAM的count统计不必定比其它引擎快。
  4. 可使用explain查询近似值,用近似值替代count(*)
  5. 增长汇总表
  6. 使用缓存

优化关联查询

  1. 肯定ON或者USING子句中是否有索引。
  2. 确保GROUP BY和ORDER BY只有一个表中的列,这样MySQL才有可能使用索引。

优化子查询

  1. 用关联查询替代
  2. 优化GROUP BY和DISTINCT
  3. 这两种查询据可使用索引来优化,是最有效的优化方法
  4. 关联查询中,使用标识列分组的效率更高
  5. 若是不须要ORDER BY,进行GROUP BY时加ORDER BY NULL,MySQL不会再进行文件排序。
  6. WITH ROLLUP超级聚合,能够挪到应用程序处理

优化LIMIT分页

  1. LIMIT偏移量大的时候,查询效率较低
  2. 能够记录上次查询的最大ID,下次查询时直接根据该ID来查询

优化UNION查询

UNION ALL的效率高于UNION

优化WHERE子句

解题方法对于此类考题,先说明如何定位低效SQL语句,而后根据SQL语句可能低效的缘由作排查,先从索引着手,若是索引没有问题,考虑以上几个方面,数据访问的问题,长难查询句的问题仍是一些特定类型优化的问题,逐一回答。

问题28:SQL语句优化的一些方法?

1.对查询进行优化,应尽可能避免全表扫描,首先应考虑在 where 及 order by 涉及的列上创建索引。

2.应尽可能避免在 where 子句中对字段进行 null 值判断,不然将致使引擎放弃使用索引而进行全表扫描,如:

MySQL的这28道常见面试题,看你会不会!

3.应尽可能避免在 where 子句中使用!=或<>操做符,不然引擎将放弃使用索引而进行全表扫描。

4.应尽可能避免在 where 子句中使用or 来链接条件,不然将致使引擎放弃使用索引而进行全表扫描,如:

MySQL的这28道常见面试题,看你会不会!

5.in 和 not in 也要慎用,不然会致使全表扫描,如:

MySQL的这28道常见面试题,看你会不会!

6.下面的查询也将致使全表扫描:select id from t where name like ‘%李%’若要提升效率,能够考虑全文检索。

7.若是在 where 子句中使用参数,也会致使全表扫描。由于SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,若是在编译时创建访问计划,变量的值仍是未知的,于是没法做为索引选择的输入项。以下面语句将进行全表扫描:

MySQL的这28道常见面试题,看你会不会!

8.应尽可能避免在 where 子句中对字段进行表达式操做,这将致使引擎放弃使用索引而进行全表扫描。如:

MySQL的这28道常见面试题,看你会不会!

9.应尽可能避免在where子句中对字段进行函数操做,这将致使引擎放弃使用索引而进行全表扫描。如:

MySQL的这28道常见面试题,看你会不会!

10.不要在 where 子句中的“=”左边进行函数、算术运算或其余表达式运算,不然系统将可能没法正确使用索引。

总结:

但愿这些Mysql常见的题可以给在求职路上的你一些帮助,同时也帮你们整理了部分的答案和更多的面试题给你们,但愿你们在面试的时候也可以用到。

相关文章
相关标签/搜索