登陆

用户

上一篇:荣华程序员分享:如何规
划自己的技术成长路径! 下一篇:MySQL挑战:10万连接数!

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

来源:荣华软件   2019-05-05 14:50

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

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

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

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

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

触发器是指一段代码,当触发某个事件时,自动执行这些代码。在MySQL数据库 中有如下六种触发器:

1、Before Insert

2、After Insert

3、Before Update

4、After Update

5、Before Delete

6、After Delete

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

FLOAT类型数 据可以存储至多8位十进制数,并在内存中占4字节。

DOUBLE类型数 据可以存储至多18位十进制数,并在内存中占8字节。

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


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


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

int(0)表示数据是INT类型,长度是0、char(16)表示固定长度字符串,长度为16、varchar(16)表示可变长度字符串,长度为16、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引擎的特性

1、插入缓冲(insert buffer)

2、二次写(double write)

3、自适应哈希索引(ahi)

4、预读(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中,索引,主键,唯一索引,联合索引的区别,对数据 库的性能有什么影响?

一个表 只能有一个主键索引,但是可 以有多个唯一索引。

1、主键索 引一定是唯一索引,唯一索 引不是主键索引。

2、主键可 以与外键构成参照完整性约束,防止数据不一致。

3、联合索引:将多个 列组合在一起创建索引,可以覆盖多个列。(也叫复合索引,组合索引)

4、外键索引:只有InnoDB类型的 表才可以使用外键索引,保证数据的一致性、完整性、和实现级联操作(基本不用)。

5、全文索引: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字段中


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

六种关联查询

1、交叉连接(CROSS JOIN)

2、内连接(INNER JOIN)

3、外连接(LEFT JOIN/RIGHT JOIN)

4、联合查询(UNION与UNION ALL)

5、全连接(FULL JOIN)

6、交叉连接(CROSS JOIN)


内连接分为三类

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)

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

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

联合查询(UNION与UNION ALL)


1、就是把 多个结果集集中在一起,UNION前的结果为基准,需要注 意的是联合查询的列数要相等,相同的记录行会合并

2、如果使用UNION ALL,不会合 并重复的记录行

3、效率 UNION 高于 UNION ALL

全连接(FULL JOIN)

1、MySQL不支持全连接

2、可以使用LEFT JOIN 和UNION和RIGHT JOIN联合使用


嵌套查询

用一条SQL语句得 结果作为另外一条SQL语句得条件,效率不好把握


解题方法

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

问题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为索引


2、如果A表的TID不是连续的,那么就 需要使用覆盖索引.TID要么是主键,要么是辅助索引,B表ID也需要有索引。


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


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


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


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

考点分析:

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

延伸考点:

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

2、优化长难的查询语句

3、优化特 定类型的查询语句

如何查 找查询速度慢的原因

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

使用show profile


使用show status

show status会返回一些计数器,show global status会查看 所有服务器级别的所有计数

有时根据这些计数,可以推 测出哪些操作代价较高或者消耗时间多

show processlist

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

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

使用explain

分析单条SQL语句

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

1、访问数 据太多导致查询性能下降

2、确定应 用程序是否在检索大量超过需要的数据,可能是太多行或列

3、确认MySQL服务器 是否在分析大量不必要的数据行

4、避免犯如下SQL语句错误

5、查询不需要的数据。解决办法:使用limit解决

6、多表关联返回全部列。解决办法:指定列名

7、总是返回全部列。解决办法:避免使用SELECT *

8、重复查询相同的数据。解决办法:可以缓存数据,下次直接读取缓存

9、是否在 扫描额外的记录。解决办法:

10、使用explain进行分析,如果发 现查询需要扫描大量的数据,但只返回少数的行,可以通 过如下技巧去优化:

11、使用索引覆盖扫描,把所有 的列都放到索引中,这样存 储引擎不需要回表获取对应行就可以返回结果。

12、改变数 据库和表的结构,修改数据表范式

13、重写SQL语句,让优化 器可以以更优的方式执行查询。

优化长难的查询语句

1、一个复 杂查询还是多个简单查询

2、MySQL内部每 秒能扫描内存中上百万行数据,相比之下,响应数 据给客户端就要慢得多

3、使用尽 可能小的查询是好的,但是有 时将一个大的查询分解为多个小的查询是很有必要的。

4、切分查询

5、将一个 大的查询分为多个小的相同的查询

6、一次性删除1000万的数 据要比一次删除1万,暂停一 会的方案更加损耗服务器开销。

7、分解关联查询,让缓存的效率更高。

8、执行单 个查询可以减少锁的竞争。

9、在应用 层做关联更容易对数据库进行拆分。

10、查询效 率会有大幅提升。

11、较少冗余记录的查询。

优化特 定类型的查询语句

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 值判断,否则将 导致引擎放弃使用索引而进行全表扫描,如:


3、应尽量避免在 where 子句中使用!=或<>操作符,否则引 擎将放弃使用索引而进行全表扫描。

4、应尽量避免在 where 子句中使用or 来连接条件,否则将 导致引擎放弃使用索引而进行全表扫描,如:


5、in 和 not in 也要慎用,否则会导致全表扫描,如:


6、下面的 查询也将导致全表扫描:select id from t where name like ‘%李%’若要提高效率,可以考虑全文检索。

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


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


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


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


  

       随时随 地了解更多最新资讯,关注荣华软件官方公众号:ronghuasoft


0条回答

登陆后可回复

  1. 登陆
  2. 注册
服务热线

400-692-8081

( 周一至周五 09:00-17:00 )

联系我们

名称:烟台荣 华软件科技有限公司

地址:烟台市高新区航天路101号C栋5楼516

座机:0535-3458081

邮箱:001@

Q Q:327195471

Copyright@2018 烟台荣 华软件科技有限公司 版权所有 鲁ICP备14003838号-1

友情链接:    万人彩票app   正规时时彩的网址大全   万人彩票技巧   三分时时彩   十大网络彩票