MySQL面试题

Posted chengdongzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL面试题相关的知识,希望对你有一定的参考价值。

01. 列举常见的关系型数据库和非关系型都有那些?

1.关系型数据库通过外键关联来建立表与表之间的关系,---------常见的有:SQLite、Oracle、mysql

2.非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定 ---常见的有:MongoDb、redis

02. MySQL常见数据库引擎及比较?  

  MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。

· InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。(提供行级锁)

· BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性。

· Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。

· Merge:允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。

· Archive:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。

· Federated:能够将多个分离的MySQL服务器链接起来,从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。

· Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。 · Other:其他存储引擎包括CSV(引用由逗号隔开的用作数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速创建定制的插件式存储引擎提供帮助)。

一般来说不使用事务的话,请使用MyISAM引擎,使用事务的话,一般使用InnoDB ------仙子啊学习现在我们用的主要是InnoDB 注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。


03. 简述数据三大范式?

什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些 规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。

什么是三大范式:

第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要 求,否则,将有很多基本操作在这样的关系模式中实现不了。

第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。

第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF. 注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性

 


04. 什么是事务?MySQL如何支持事务?  

事务就是一段sql 语句的批处理,但是这个批处理是一个原子 ,不可分割,要么都执行,要么回滚(rollback)都不执行。

事务具体四大特性,也就是经常说的ACID :

1.原子性(所有操作要么全部成功,要么全部失败回滚)

2.一致性(事务执行之前和执行之后都必须处于一致性状态。)

3.隔离性(数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离)

4.持久性(一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即使遭遇故障依然能够通过日志恢复最后一次更新) 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务

MYSQL 事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT来实现 BEGIN 开始一个事务 ROLLBACK 事务回滚 COMMIT 事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式: SET AUTOCOMMIT=0 禁止自动提交 SET AUTOCOMMIT=1 开启自动提交


05. 简述数据库设计中一对多和多对多的应用场景?  

一对多:学生与班级---一个学生只能属于一个班级,一个班级可以有多个学生

多对多:学生与课程---一个学生可以选择多个课程,一个课程也可以被多个学生选择


06. 如何基于数据库实现商城商品计数器?

创建一个商城表---包含(id,商品名,每一个商品对应数量)

create table product

  (id primary key auto_increment,

    pname varchar(64),

     pcount int);

 

07. 简述触发器、函数、视图、存储过程?

触发器:触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块。

     create trigger trigger_name

   after/before insert /update/delete on 表名

   for each row

   begin

   sql语句:(触发的语句一句或多句)

   end

 函数:MySQL中提供了许多内置函数,还可以自定义函数(实现程序员需要sql逻辑处理)

   自定义函数创建语法:

       创建:CREATE FUNCTION 函数名称(参数列表)  

          RETURNS 返回值类型  函数体

   修改: ALTER FUNCTION 函数名称 [characteristic ...]

   删除:DROP FUNCTION [IF EXISTS] 函数名称

   调用:SELECT 函数名称(参数列表)

  

   视图:视图是由查询结果形成的一张虚拟表,是表通过某种运算得到的一个投影

      create view view_name as select 语句

   存储过程:把一段代码封装起来,当要执行这一段代码的时候,可以通过调用该存储过程来实现(经过第一次编译后再次调用不需要再次编译,比一个个执行sql语句效率高)

   create procedure 存储过程名(参数,参数,…)

   begin

   //代码

   end

 


08. MySQL索引种类

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度

MySQL索引的类型:

   1. 普通索引:这是最基本的索引,它没有任何限制

   2.唯一索引:索引列的值必须唯一,但允许有空值,如果是组合索引,则列值的组合必须唯一

   3.全文索引:全文索引仅可用于 MyISAM 表,可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加 (切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法)

   4. 单列索引、多列索引:多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。

   5.组合索引(最左前缀):简单的理解就是只从最左面的开始组合(实在单列索引的基础上进一步压榨索引效率的一种方式)


09. 索引在什么情况下遵循最左前缀的规则?  

 mysql在使用组合索引查询的时候需要遵循“最左前缀”规则

10. 主键和外键的区别?  

1.主键是能确定一条记录的唯一标识

2.外键用于与另一张表的关联,是能确定另一张表记录的字段,用于保持数据的一致性


11. MySQL常见的函数?  

聚合函数:

   AVG(col)返回指定列的平均值

   COUNT(col)返回指定列中非NULL值的个数

   MIN(col)返回指定列的最小值

   MAX(col)返回指定列的最大值

   SUM(col)返回指定列的所有值之和

   GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果

数学函数:

   ABS(x) 返回x的绝对值

   BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)


12. 列举创建索引但是无法命中索引的8种情况。  

1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

2.对于多列索引,不是使用的第一部分,则不会使用索引

3.like查询是以%开头

4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

6 对小表查询

7 提示不使用索引

8 统计数据不真实

9.单独引用复合索引里非第一位置的索引列.


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

1 执行 SHOW VARIABLES LIKE “%slow%”,获知 mysql 是否开启慢查询 slow_query_log 慢查询开启状态 OFF 未开启 ON 为开启 slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)

2 修改配置文件( 放在[mysqld]下),重启 long_query_time 查询超过多少秒才记录

3 测试是否成功

4 慢查询日志文件的信息格式


14. 数据库导入导出命令(结构+数据)?    

1.导出整个数据库  

 mysqldump -u用户名 -p密码 数据库名 > 导出的文件名   

例如:C:Usersjack> mysqldump -uroot -pmysql sva_rec > e:sva_rec.sql  

 2.导出一个表,包括表结构和数据  

 mysqldump -u用户名 -p 密码 数据库名 表名> 导出的文件名   

例如:C:Usersjack> mysqldump -uroot -pmysql sva_rec date_rec_drv> e:date_rec_drv.sql  

 3.导出一个数据库结构  

 例如:C:Usersjack> mysqldump -uroot -pmysql -d sva_rec > e:sva_rec.sql

4.导出一个表,只有表结构  

 mysqldump -u用户名 -p 密码 -d数据库名 表名> 导出的文件名   

  例如:C:Usersjack> mysqldump -uroot -pmysql -d sva_rec date_rec_drv> e:date_rec_drv.sql   

5.导入数据库   

常用source 命令   

进入mysql数据库控制台,   

如mysql -u root -p   mysql>use 数据库   

然后使用source命令,后面参数为脚本文件(如这里用到的.sql)   

mysql>source d:wcnc_db.sql


15. 数据库优化方案?

总体思路从以下几个方面:

1、选取最适用的字段属性

2、使用连接(JOIN)来代替子查询(Sub-Queries)

3、使用联合(UNION)来代替手动创建的临时表

4、事务(当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰)

5.锁定表(有些情况下我们可以通过锁定表的方法来获得更好的性能)

6、使用外键(锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键)

7、使用索引

8、优化的查询语句(绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用)


16. char和varchar的区别?

char:定长,char的存取数度相对快

varchar:不定长,存取速度相对慢

到底如何取舍可以根据一下几个方面考虑:

1、对于MyISAM表,尽量使用Char,对于那些经常需要修改而容易形成碎片的myisam和isam数据表就更是如此,它的缺点就是占用磁盘空间;

2、对于InnoDB表,因为它的数据行内部存储格式对固定长度的数据行和可变长度的数据行不加区分(所有数据行共用一个表头部分,这个标头部分存放着指向各有关数据列的指针), 所以使用char类型不见得会比使用varchar类型好。事实上,因为char类型通常要比varchar类型占用更多的空间,所以从减少空间占用量和减少磁盘i/o的角度,使用varchar类型反而更有利;

3、存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。

4、固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。

5、十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。

 

17. 简述MySQL的执行计划?

执行计划explain命令是查看查询优化器如何决定执行查询的主要方法。

这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,通过输出结果反推执行过程


18. 在对name做了唯一索引前提下,简述以下区别:

select * from tb where name = ‘Oldboy’ -------------查找到tb表中所有name = ‘Oldboy’的数据

select * from tb where name = ‘Oldboy’ limit 1------查找到tb表中所有name = ‘Oldboy’的数据只取其中的第一条

 

19.什么是索引合并?
1、索引合并是把几个索引的范围扫描合并成一个索引。
2、索引合并的时候,会对索引进行并集,交集或者先交集再并集操作,以便合并成一个索引。
3、这些需要合并的索引只能是一个表的。不能对多表进行索引合并。

简单的说,索引合并,让一条sql可以使用多个索引。对这些索引取交集,并集,或者先取交集再取并集。
从而减少从数据表中取数据的次数,提高查询效率。

 20.简述数据库分库分表?(水平、垂直)

 1、分库
    当数据库中的表太多,将某些表分到不同数据库,例如:1W张表时
    代价:连表查询跨数据库,代码变多
# 2、分表
    水平分表:将某些列拆分到另一张表,例如:博客+博客详情
    垂直分表:将某些历史信息,分到另外一张表中,例如:支付宝账单
21.redis和memcached比较?
区别
1:redis不仅支持简单的key_value类型,还支持字典,字符串,列表,集合,有序集合类型
2:内存使用效率对比,使用简单的key-value存储的话,
Memcached的内存利用率更高而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。 3.性能对比:由于Redis只使用单核,而Memcached可以使用多核,.
所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis, 4.Redis虽然是基于内存的存储系统,但是它本身是支持内存数据的持久化的,而且提供两种主要的持久化策略:RDB快照和AOF日志。
而memcached是不支持数据持久化操作的。 5.集群管理不同,Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。

以上是关于MySQL面试题的主要内容,如果未能解决你的问题,请参考以下文章

关于mysql面试题

Java进阶之光!2021必看-Java高级面试题总结

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!

MySQL # MySQL相关面试题

大厂Mysql高频面试题!java多数据源的优缺点

Java面试题!mysql格式化查询结果