MySQL面试题
MyISAM和InnoDB的区别有哪些
- InnoDB支持事务, MyISAM不支持
- InnoDB支持行级锁, MyISAM支持表级锁
- InnoDB支持多版本并发控制(MVVC), MyISAM不支持
- InnoDB支持外键, MyISAM不支持
- MyISAM支持全文索引, InnoDB部分版本不支持(但可以使用Sphinx插件)
MySQL怎么恢复半个月前的数据
通过整库备份+binlog进行恢复. 前提是要有定期整库备份且保存了binlog日志
MySQL事务的隔离级别, 分别有什么特点
- 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到
- 读提交(RC): 一个事务提交之后, 它做的变更才会被其他事务看到
- 可重复读(RR): 一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的. 当
然在可重复读隔离级别下, 未提交变更对其他事务也是不可见的
- 串行化(S): 对于同一行记录, 读写都会加锁. 当出现读写锁冲突的时候, 后访问的事务必须等前一个
事务执行完成才能继续执行
MySQL中有哪几种锁
- 表级锁: 开销小, 加锁快; 不会出现死锁; 锁定粒度大, 发生锁冲突的概率最高, 并发度最低。
- 行级锁: 开销大, 加锁慢; 会出现死锁; 锁定粒度最小, 发生锁冲突的概率最低, 并发度也最
高。
- 页面锁: 开销和加锁时间界于表锁和行锁之间; 会出现死锁; 锁定粒度界于表锁和行锁之间, 并
发度一般。
MySQL 中有哪些不同的表格
共有 5 种类型的表格: 1、MyISAM2、Heap 3、Merge 4、INNODB 5、MISAM
MySQL 中InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?
- read uncommited : 读到未提交数据
- read committed: 脏读, 不可重复读
- repeatable read: 可重读
- serializable : 串行事物
CHAR 和VARCHAR 的区别
- char:定长,存取效率高,一般用于固定长度的表单提交数据存储,例如:身份证号,手机号,电话,密码等,长度不够的时候,会采取右补空格的方式。
- varchar:不定长,更节省空间,需要用一个或者两个字节来存储数据的长度。具体规则是:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。
SQL语句主要分为哪几类
- 数据定义语言DDL(Data Ddefinition Language)CREATE,DROP,ALTER,主要为以上操作即对逻辑结构等有操作的,其中包括表结构,视图和索引。
- 数据查询语言DQL(Data Query Language)SELECT,这个较为好理解,即查询操作,以select关键字,各种简单查询,连接查询等,都属于DQL。
- 数据操纵语言DML(Data Manipulation Language)INSERT,UPDATE,DELETE 主要为以上操作,即对数据进行操作的,DQL与DML共同构建了常用的增删改查操作。
- 数据控制功能DCL(Data Control Language)GRANT,REVOKE,COMMIT,ROLLBACK主要为以上操作即对数据库安全性完整性等有操作的,可以简单的理解为权限控制等。
SQL 约束有哪些
- NOT NULL: 用于控制字段的内容一定不能为空(NULL)。
- UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束。
- PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个。
- FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
主键和外键
- 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行,这样的一列或多列称为表的主键,通过它可强制表的实体完整性。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。
- 外键:在一个表中存在的另一个表的主键称此表的外键。
in和exists的区别
在 MySQL 中,IN 关键字用于在一个字段中匹配多个值
1 | select column from table where column in (n1, n2, ...) |
EXISTS 关键字用于检查子查询的结果是否为空
1 | select column1, column2 from table_1 where exists (select * from table2 where xxx=xxx) |
如果查询的两个表大小相当,那么用in和exists差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。
drop delete truncate的区别
| Delete | Truncate | Drop | |
|---|---|---|---|
| 类型 | 属于DML | 属于DDL | 属于DDL |
| 回滚 | 可回滚 | 不可回滚 | 不可回滚 |
| 删除内容 | 表结构还在,删除表的全部或者一部分数据行 | 表结构还在,删除表中的所有数据 | 从数据库中删除表,所有的数据行,索引和权限也会被删除 |
| 删除速度 | 删除速度慢,需要逐行删除 | 删除速度快 | 删除速度最快 |
replace into 和 insert on duplicate key update的区别
replace into和on duplcate key update都是只有在primary key或者unique key冲突的时候才会执行“更新操作”。replace into会将已有的数据删除然后重新插入,这样就会有一种情况,如果某些字段有默认值,但是replace into语句的字段不完整,则会设置成默认值,主键id会变更。on duplicate key update则是执行update后面的语句
UNION ALL与UNION的区别
- 返回结果
union all是直接连接,取到得是所有值,记录可能有重复;
union 是取唯一值,记录没有重复。
- 排序
union将会按照字段的顺序进行全量排序;
union all只是简单的将两个结果合并后就返回。
- 效率
从效率上说,union all 要比union快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用union all。