1、事务的几个特性
- Atomicity原子性:要么全部执行要么全部不执行
- Consistency一致性:事务必须保持系统处于一致的状态,不管在任何时间给定的事务有多少。
- Isolation 隔离性,在事务正式提交之前,不能把该事务的任何改变提交给其他事务。
- Durability持久性:事务完成后,该事务对数据库的 操作便持久的保存在数据库中,不会回滚。
2、MySQL支持几种事务隔离级别?
- 读未提交:允许脏读,可能会读到其他事务未提交的数据。
- 读已提交:只能读已提交,Oracle数据库默认
- 可重复读:指同一个事务内的查询都是事务开始时一致的,Mysql的默认级别。消除了不可重复读,但可能存在幻读。
- 串行化:完全串行化的读,每次都需要获取表级共享锁,读写相互阻塞。
3、MySQL中MVCC是什么?
MVCC(Mutil-Version Concurrency Control),就是多版本并发控制,mvcc可以认为是行级锁的一个变种,它可以在多种情况下避免加锁,因此开销更低。MVCC的实现大都都实现了非阻塞的读操作,写操作也支持锁定必要的行。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。MVCC可以看作是乐观锁的一种实现方式。在Java编程中,如果把乐观锁看成一个接口,MVCC便是这个接口的一个实现类而已。
4、MySQL的锁级别有哪几种?
行级锁,表级锁,页级锁。
5、MySQL中表锁有,行锁有?
意向共享锁(IS锁),意向排他锁(IX锁),自增锁。MySQL的行锁有共享锁和排他锁。
- 共享锁:又称读锁,简称S锁,可以读数据但是不能写数据。
- 排他锁:又称写锁,简称X锁,其他事务不能再读或者写。
6、数据库的三范式是什么?
- 第一范式:表中的每一项都是不可分割的原子项
- 第二范式:要求实体属性完全依赖于主关键字,所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
- 第三范式:任何非主属性不依赖于其他非主属性。
7、MySQL问题排查都有哪些手段?
- 使用explain命令查询SQL语句执行计划。
- 开启慢查询日志,查看慢查询的SQL。
- 使用show Processlist查看当前的所有连接信息。
8、MySQL常用的引擎
InnoDB引擎,它提供了对数据库的ACID事务的支持,并且还提供了行级锁和外键的约束,他的设计目标就是处理大数据容量的数据库系统,MySQL运行的时候,InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持全文搜索,同时启动较慢,它不会保存表的行数,锁的粒度小,写操作不会锁定全表,在并发度较高的场景下使用效率较高。
MyIASM引擎,MySQL的默认引擎,但不提供事务的支持,也不支持行级锁和外键,因此当执行插入和更新语句时,即执行写操作时需要锁定全表,效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count(*) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。
9、如何做MySQL性能优化?
- 选择适合的引擎
- 垂直分割表
- 避免使用select *
- 为搜索字段创建索引。
10、存储过程
存储过程是再大型的数据库中,一组为了完成特定功能的SQL语句集,它存储在数据库中,一次编译后永久生效,用户通过给定存储过程的名字并给出参数来执行它,存储过程是数据库中的一个重要对象,在数据量特别庞大的情况下存储过程能够达到倍速的效率提升。
创建存储过程的步骤:
-
修改语句结束符
-
定义存储过程
-
将delimiter修改回分号,然后使用call 调用过程。
11、触发器
触发器是一种特殊的存储过程,主要是通过事件来触发而被执行,它可以强化约束,维护数据的完整性和一致性,可以跟踪数据库内的操作而不允许未经许可的更新和变化。触发器不能手动调用,只能系统自动调用。
12、MySQL索引类型
- 普通索引
- 唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一;
- 主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;
- 组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合;
- 全文索引:主要用来查询文本中的关键字,而不是直接与索引中的值相比较,mysql中MyISAM支持全文索引而InnoDB不支持;
13、 引擎MykSAM和InnoDB的对比
MylSAM | InnoDB |
---|---|
不支持事务,每次查询都是原子的 | 支持事务ACID,支持事务四种隔离级别 |
不支持行级锁,每次都对整个表加锁 | 支持行级锁,支持并发 |
存储总行数 | 不存储 |
一个MYISAM表有三个文件:索引文件、表结构文件、数据文件; | 存储在一个文件空间 |
非聚集索引 | 聚集索引 |
14、什么情况下设置了索引但是无法使用?
- 模糊查询,如 like %aaa, 但是如果使用like aaa%可以
- 数据类型出现隐式转换
- or语句前后没有同时使用
- 在索引项上运算
- 此外,还有组合索引多种情况无法使用索引,具体这里不详细说了
15、mysql的日志类型
- 错误日志
- 查询日志
- 慢查询日志
- 二进制日志
- 中继日志
16、为什么MySQL索引使用B+树不使用hash表?
- 1、 哈希表不支持模糊查找,只能遍历整个表,但是B+树通过最左前缀匹配能够快速找到对应的数据。
- 2、哈希表不支持范围查询
- 3、3、 如果索引字段相同的过多的话,那么哈希表中它们都映射成相同的位置,形成一条长长的链表,查找时间增加。
17 、MySQL数据并发产生的问题
- 脏读:事务A读取了B未提交的数据,当B回滚之后,A读到的就是脏数据。
- 不可重复读:事务A多次读取同一数据,但是每次读到的值不一样,因为事务B多次对数据进行更新和提交。
- 幻读:事务A多次读取,但是每次读取到的条数不一样。