MySQL
目录
1.数据库常见的几种引擎?
- MyISAM:全表锁,不支持事务和外键;
- InnoDB:行级锁,支持事务和外键;
- Memory:内存操作,读写快,但重启会丢失数据,不支持事务和外键;
2.什么是事务?
事务是对数据库中进行一系列回滚或提交的操作,用来保存数据的完整性和一致性。
3.事务四大特性?
ACID:
- A:原子性:要么全部成功全部失败;
- C:一致性:事务执行前后原本数据库一致数据仍然一致;
- I:隔离性:事务和事务之间不干涉;
- D:持久性:事务一旦提交,对数据库中的数据改变是永久的.
4.脏读?不可重复读?幻读?
- 脏读:也叫“读未提交”读到的数据是错误的,是读到事务还没提交的数据。
- 不可重复读:一个事务多次读同一个数据却得到不同的结果。例:A先读取一个数据12,B事务修改数据13,随后事务A又读了数据两次结果不同。
- 幻读:第一次读取到的结果数量和第二次读取结果数量不一致。例:A读取一个表中全部数据数量得到1,随后B删除数据后提交然后A再读数据两次总数不一样。
- 注:不可重复读和脏读是基于数据内容的错误,幻读是基于数据总量的错误
5.事务的隔离级别?
- 读未提交:该隔离级别,所有事务可以读到其它未提交事务的执行结果。读取未提交的数据也是脏读
- 读已取提交:一个事务只能看见已经提交事务对数据的改变。解决脏读。
- 可重复读:mysql默认隔离级别,同一个事务在并发读取数据时会看到同样的数据。但是幻读无法解决,解决脏读和不可重复读
- 可串行化:最高隔离级别,它在每个读数据行上加共享锁,不能相互冲突,解决幻读。可以解决所有事务错误
6.什么是索引?
索引是一种高效获取数据的数据结构,相当于目录,占用物理空间。默认B+树结构,或者hash结构
7.索引的数据类型?
默认B+树结构:
①b+树数据都存放在叶子节点中,非叶子节点就可以存放大量索引数据,这样树的层次就越少,io次数减少。
②b+树所有叶子节点是相连的形成一个双向链表。
③因为索引和数据分开存储,不用全表扫描并且是一个顺序读取数据的过程。
8.索引有哪几类?
分为聚簇索引(主键索引)和非聚簇索引(非主键索引)。
1.唯一索引(索引值必须唯一,允许索引字段为空)
2.普通索引(基本索引类型,允许索引为空且重复)
3.主键索引(索引值唯一不为空)
4.复合索引(多个字段加索引,遵循最左匹配原则)
9.复合索引?
在查询条件是多个的时候,推荐使用。因能覆盖更多的索引,并且能极大减少回表带来的性能开销。
10.什么叫回表?
回表:通过辅助索引没有拿到我们想要的数据,拿到主键去聚簇索引查询这个过程叫回表。
11.什么叫索引覆盖?
索引覆盖:从辅助索引能直接拿到我们想要的数据就是索引覆盖。
12.聚簇索引和非聚簇索引?
- 聚簇索引:就是将一行一行的数据和索引结构放在一起,叶子节点存储的就是行数据。innodb存储索引使用的就是聚簇索引,聚簇索引又默认主键作为索引。
- 非聚簇索引:非聚簇索引又叫辅助索引。叶子节点存储的不是行数据而是主键ID。
13.最左匹配原则?
从最左索引开始匹配任何连续的索引都能匹配上,但遇到范围查询就让后面范围的索引失效。例:复合索引(a,b.c.d) 条件 a=1 and b=2 and c>3 and d=4 这样d索引用不到。
14.为何推荐自增主键作为索引?
因uuid值太过分散,新增字段可能会插在树中间位置,这样会不断的调整数据地址。而自增只需要一页一页的写,磁盘碎片少效率也高。
15.什么情况下适合建索引?什么情况下不适合检索?
- 适合:
1.频繁作为where查询条件字段。
2.表关联字段。
3.排序的字段。
4.用作统计的字段- 不适合:
1.频繁更新的字段。
2.重复比较多的字段不适合。
3.参与计算的字段。
4.可以确定数据比较少的表。
16.索引失效的几种情况?
- like查询以%开头的,会导致查询结果无序;
- 不遵循最左匹配原则;
- 全表扫描快于索引查询;
- 条件中有or而or连接字段有没有索引的也会失效,因为没有索引会走全表扫描,这样还不如一开始就全表扫描。
17.常见的几种索引优化?
- 尽量不用select * 避免大量回表。
- 少用子查询,避免产生笛卡尔集
- 尽量使用自增主键,避免碎片多。
- 需要用到辅助索引尽量索引覆盖,不要回表。
- 多使用复合索引减少回表。
18.sql执行顺序?
8.select 数据 9.distinct(去重字段) 6.聚合函数
1.from 表名
3.inner|left|right join 表名
2.on 条件
4.where 条件
5.group by
7.having 过滤条件
10.order by 要排序字段
11.limit 开始的行数,每页返回的行数
19.怎么优化sql语句?
①不要用select * 要使用具体字段。
②避免返回大量数据,能用分页最好。
③使用索引提升查询速度,索引字段要设计好。
④避免子查询,连表。
20.Mysql中char和varchar区别?
char长度固定,varchar长度可变。char效率高于varchar
21.什么情况下行锁升级为表锁?
①行锁是建立在索引基础上;
②在未加索引和索引失效的情况下会升级成表锁。