MySQL常见面试题
01. 列举常见的关系型数据库和非关系型都有那些?
关系型:Oracle、DB2、Microsoft SQL Server、MySQL、SQLite
非关系型:Redis、Hbase、MongodDB
02. MySQL常见数据库引擎及比较?
传送门:MySQL常见数据库引擎及比较
03. 简述数据三大范式?
传送门: MySQL数据三大范式
04. 什么是事务?MySQL如何支持事务?
传送门:MySQL事务
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索引种类?
传送门:MySQL索引类型
09. 索引在什么情况下遵循最左前缀的规则?
在使用组合索引查询的时候需要遵循“最左前缀”规则
最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d= 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,MySQL的查询优化器会帮你优化成索引可以识别的形式。
10. 主键和外键的区别?
主键Primary key:数据库实体完整性的一种规则,唯一标示一个实体,取值非空唯一。比如,学生表的学号。
外键 Foreign key:数据库参照完整性的一种规则,将两表或者多张表联系起来,取值必须来自参照表的参照字段的值,可为空也可不为空。比如,选课表里的学号。
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. 如何开启慢查询日志?
传送门:MySQL开启慢查询日志
1 执行 SHOW VARIABLES LIKE “%slow%”,获知 mysql 是否开启慢查询 slow_query_log 慢查询开启状态 OFF 未开启 ON 为开启 slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)
2 修改配置文件( 放在[mysqld]下),重启 long_query_time 查询超过多少秒才记录
3 测试是否成功
4 慢查询日志文件的信息格式
作用:开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。
14. 数据库导入导出命令(结构+数据)?
传送门:MySQL数据库导入导出命令
15. 数据库优化方案?
传送门:MySQL优化
1、选取最适用的字段属性
2、使用连接(JOIN)来代替子查询(Sub-Queries)
3、使用联合(UNION)来代替手动创建的临时表
4、事务(当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰)
5.锁定表(有些情况下我们可以通过锁定表的方法来获得更好的性能)
6、使用外键(锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键)
7、使用索引
8、优化的查询语句(绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用)
16. 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来说是不需要的。
char固定长度,存取速度快,牺牲存储空间来提高效率
varchar长度依照的字符长度而定,存取速度较varchar慢,牺牲存取效率,提高存储空间利用率
注意:取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的;CHAR(10)若输入数据的字符数小于10,则系统自动在其后添加空格来填满设定好的空间。若输入的数据过长,将会截掉其超出部分。VARCHAR(10)数据类型的存储长度为实际数值长度。
char的存储方式是:对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;
varchar的存储方式是:对每个英文字符占用2个字节,汉字也占用2个字节。
17. 简述MySQL的执行计划?
传送门:MySQL的执行计划
18. 在对name做了唯一索引前提下,简述以下区别:
select * from tb where name = ‘Oldboy’
select * from tb where name = ‘Oldboy’ limit 1