Java面试准备-Mysql
原创
©著作权归作者所有:来自51CTO博客作者rundreamsFly的原创作品,请联系作者获取转载授权,否则将追究法律责任
Mysql常用的数据引擎有哪些
- InnoDB:行及锁、主要有事务的支持,支持自增长列,支持外健约束,并发能力强。
- MyISAM:全表锁、不支持事务、不支持外健,并发性能差,占用空间相对较少。
- Memory:全表锁、速度快、存储内存中,重启数据会丢失。
- Merge:MyISAM表的组合。
- 区别:
- InnoDB不保存具体的行数,每次需要进行求和,也就是全表扫描、而MyISAM用一变量保存了整个表的行数,执行变量即可读出函数,速度很快。
- InnoDB不支持全文索引、而MyISAM支持全文索引,查询效率更高。
数据库事务的特性
- ACID:原子性、一致性、隔离性、持久性
-
原子性(Atomic):要么全部成功、要么全部失败。
-
一致性(Consistency):事务操作成功后,数据库状态和业务规则保持一致。
-
隔离性(Isolation):在并发操作时,不同的事务拥有各自的空间,彼此不互相干扰
-
持久性(Durabiliy):事务超过成功后,所有数据都需持久化到数据库中。
什么是索引
- 是Mysql高效获取数据的数据算法,通俗的讲:数据库的索引就好比一本书的目录,能够加快数据库表的查询速度。
- 索引往往是存在于磁盘中的,没有特别说明,默认是B+树结构。
SQL优化手段有哪些
- 查询不要用 select *
- 尽量减少子查询,采用联合关联查询
- 尽量减少not in 等查询效率比较低的查询条件,特别是整表扫描。
- 尽量避免where条件后面 使用 != <> 操作符,这样会导致全表扫描
简单说下 drop、delete、truncate的区别
- drop 删除表、delete、truncate 删除表的数据。
什么是内连接、左连接、右连接
- 内连接(Inner Join):匹配两张表中相关联的记录
- 左连接(Left Join):除了匹配两张表相关联的记录外,还会匹配左表中剩余的记录,右表中位匹配到的字段用null表示
- 右连接(Right Join):除了匹配两张表相关联的记录外,还会匹配右表中剩余的记录
事务隔离级别
- InnoDB采用的是可重复读,MVCC 不能解决幻读的问题,使用的是 Next-Key Lock 锁算法,可以规避幻读。
大数据量表该如何优化
- 限定数据查询范围:比如查询订单的时候,默认查询当天的
- 读写分离:主负责写、从负责读,根据场景,可以1住多从
- 垂直分区:根据数据表进行相关拆分,把一张表拆成多张表
- 水平拆分:保持数据结构不变,通过分片的方式存储到分布式数据库中。
- 数据库分片两种方式:客户端代理:封装在Jar包中、Sharding-JDBC
- 中间件代理:在应用和数据库中间加一个代理层,Mycat。
说说Mysql一条查询语句是如何执行的
- 获取连接:使用mysql连接器
- 查询缓存:mysql8.0已删除,不建议使用
- 分析器:分析词法和语法,一般语法错误就在这个地方
- 优化器:表里有多个索引的时候,决定采用什么索引,或者关联顺序
- 执行器:执行器判断执行条件,然后进行执行
什么时候不要使用索引
- 经常增删改的不要简历索引
- 有大量重复的列不要建立索引
- 表记录太少不要简历索引
什么是MVCC
- 多版本并发控制:是一种用来解决读写冲突无锁控制,为每一个修改保存一个版本,在读操作时不用阻塞写操作,在写操作时不用阻塞读操作,避免了脏读和不可重复读。
Mysql中的锁
- 共享锁:不阻塞,多个用户可以同一时刻读取相同的资源,相互之间没有影响。
- 排他锁:一个写操作阻塞其他读锁和写锁,这样只允许一个用户进行写入,防止其他用户读取正在写的内容。
- 表锁:MyISAM就是默认表锁
- 行锁:容易出现死锁,并发高,InnoDB支持行锁,但必须有索引,不然就是表锁。
什么时候锁会升级
- Mysql行锁只能存在于索引上,因为InnoDB把主键和相关的行数据放在B+树的叶节点上面,如果索引不存在,自动升级为表锁
- 当非唯一索引操作一定数量时,也就是数据的一半时,这个时候索引的消耗会比表锁消耗更多,这个时候行锁自动升级为表锁
怎么避免数据库死锁:
- 设置锁等待操作时间,及时失败获取,也能退出程序,不至于一直等待导致死锁
- 保持事务简短,不要过长,减少开销
- 事务隔离级别顺序执行
使用Mysql索引的时候应该注意什么
- 查询的时候尽量少用 !=,比较、函数 等,导致索引失效全表扫描
- 复合索引遵循偏左原则
- 如果mysql索引扫描比较慢,会升级为全表扫描
- 列类型是字符串时,必须加引号,不然搜索也会失效
- 表字段可以为null的,索引是不生效的
- like查询 %在前面的是不走索引的,走全表扫描