​​​​​​​Java面试之mysql合集

Java面试之mysql合集

 
1. MySQL InnoDB Mysaim 的特点?
a. InnoDB
1. ⽀持事务处理
2. ⽀持外键
3. ⽀持⾏锁
4. 不⽀持 FULLTEXT 类型的索引(在 Mysql5.6 已引⼊)
5. 不保存表的具体⾏数,扫描表来计算有多少⾏
6. 对于 AUTO_INCREMENT 类型的字段,必须包含只有该字段的索引
7. DELETE 表时,是⼀⾏⼀⾏的删除
8. InnoDB 把数据和索引存放在表空间⾥⾯
9. 跨平台可直接拷⻉使⽤
10. 表格很难被压缩
b. MyISAM
1. 不⽀持事务,回滚将造成不完全回滚,不具有原⼦性
2. 不⽀持外键
3. ⽀持全⽂搜索
4. 保存表的具体⾏数,不带 where 时,直接返回保存的⾏数
5. DELETE 表时,先 drop 表,然后重建表
6. MyISAM 表被存放在三个⽂件 。 frm ⽂件存放表格定义。 数据⽂件是 MYD ( MYData ) 。 索引⽂件是 MYI
( MYIndex )引伸
7. 跨平台很难直接拷⻉
8. AUTO_INCREMENT 类型字段可以和其他字段⼀起建⽴联合索引
9. 表格可以被压缩
c. 选择:因为 MyISAM 相对简单所以在效率上要优于 InnoDB. 如果系统读多,写少。对原⼦性要求低。那么 MyISAM 最好
的选择。且 MyISAM 恢复速度快。可直接⽤备份覆盖恢复。如果系统读少,写多的时候,尤其是并发写⼊⾼的时候。
InnoDB 就是⾸选了。两种类型都有⾃⼰优缺点,选择那个完全要看⾃⼰的实际类弄。
2. ⾏锁,表锁;乐观锁,悲观锁?
a. ⾏锁:数据库表中某⼀⾏被锁住。
b. 表锁:整个数据库表被锁住。
c. 乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别⼈不会修改,具体实现是给表增加⼀个版本号的字
段,在执⾏ update 操作时⽐较该版本号是否与当前数据库中版本号⼀致,如⼀致,更新数据,反之拒绝。
d. 悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别⼈会修改。读数据的时候会上锁,直到 update 完成才
释放锁,使⽤悲观锁要注意不要锁住整个表。
3. 数据库隔离级别是什么?有什么作⽤?
1. ISOLATION READ UNCOMMITTED 这是事务最低的隔离级别,它允许另外⼀个事务可以看到这个事务未提交的数据。
这种隔离级别会产⽣脏读,不可重复读和幻读。
2. ISOLATION READ COMMITTED 保证⼀个事务修改的数据提交后才能被另外⼀个事务读取。另外⼀个事务不能读取该
事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻读。
3. ISOLATION REPEATABLE READ 这种事务隔离级别可以防⽌脏读,不可重复读。但是可能出现幻读。它除了保证⼀个
事务不能读取另⼀个事务未提交的数据外,还保证了避免不可重复读。
4. ISOLATION_SERIALIZABLE 这是花费最⾼代价但是最可靠的事务隔离级别。事务被处理为顺序执⾏。除了防⽌脏读,
不可重复读外,还避免了幻读。 4. MySQL 主备同步的基本原理。
mysql 主备复制实现分成三个步骤:
1 master 将改变记录到⼆进制⽇志( binary log )中(这些记录叫做⼆进制⽇志事件, binary log events ,可以通过 show
binlog events 进⾏查看);
2 slave master binary log events 拷⻉到它的中继⽇志( relay log );
3 slave 重做中继⽇志中的事件,将改变反映它⾃⼰的数据。
5. select * from table t where size > 10 group by size order by size sql 语句执⾏顺序?
sql 语句执⾏顺序如下:
where -> group by -> having -> select -> orderby
6. 如何优化数据库性能(索引、分库分表、批置操作、分⻚算法、升级硬盘 SSD 、业务优化、主从部署)
1 、选择合适的数据库引擎,合理使⽤索引
2 、分⻚获取数据,只获取需要的字段
3 、优化业务逻辑,减少数据库 IO
4 、分库分表
5 、部署主从数据库
6 、升级硬件
7. SQL 什么情况下不会使⽤索引(不包含,不等于,函数)
a. select * 可能导致不⾛索引;
b. 空值会导致不⾛索引,因为 hashset 不能存空值;
c. 索引列有函数运算,不⾛索引,可以在索引列建⽴⼀个函数的索引。
d. 隐式转换可能导致不⾛索引;
e. 表的数据库⼩或者需要选择⼤部分数据,不⾛索引;
f. != 或者 <> 可能导致不⾛索引;
g. 字符型的索引列会导致优化器认为需要扫描索引⼤部分数据且聚簇因⼦很⼤,最终导致弃⽤索引扫描⽽改⽤全表扫描
⽅式 h. like '%liu' 百分号在前不⾛索引;
i. not in , not exist 不⾛索引;
8. 般在什么字段上建索引(过滤数据最多的字段)
1 、表的主键、外键必须有索引;
2 、数据量超过 300 的表应该有索引;
3 、经常与其他表进⾏连接的表,在连接字段上应该建⽴索引;
4 、经常出现在 Where ⼦句中的字段,特别是⼤表的字段,应该建⽴索引;
5 、索引应该建在选择性⾼的字段上;
6 、索引应该建在⼩字段上,对于⼤的⽂本字段甚⾄超⻓字段,不要建索引;
9. 如何从⼀张表中查出 name 字段不包含 "XYZ" 的所有⾏?
1 select * from table where name not like '%XYZ%' ;
10. HRedis , RDB A0Ff 如何做⾼可⽤、集群
11. 如何解决⾼并发减库存问题
消息队列,异步处理,减库存加锁
12. mysql 存储引擎中索引的实现机制;
https://blog.csdn.net/debug_zhang/article/details/52168552
13. 数据库事务的⼏种粒度;
a. 表锁定:对整个表的锁定。
b. ⾏锁定:只锁定进⾏更改的⾏,例如: insert update delete ,都隐式采⽤⾏锁定。
c. 数据库锁机制可分为多种粒度的: 数据库,表,⻚⾯,⾏
d. 粒度越⼤, DBMS 管理越容易,但是实现并发处理的能⼒就越差,表,⻚⾯,⾏
14. mysql 调优:
a. explain select 语句;
b. 当只要⼀条数据时使⽤ limit 1
c. 为搜索字段建索引;
d. 避免 select *
e. 字段尽量使⽤ not null
f. 垂直分割;
g. 拆分⼤的 delete insert 语句: delete insert 会锁表;
h. 分表分库分区。
15. 说说事务的四种特性( ACID )?
16. innodb 如何实现 mysql 的事务
事务进⾏过程中,每次 sql 语句执⾏,都会记录 undo log redo log ,然后更新数据形成脏⻚,然后 redo log 按照时间或
者空间等条件进⾏落盘, undo log 和脏⻚按照 checkpoint 进⾏落盘,落盘后相应的 redo log 就可以删除了。此时,事务还未
COMMIT ,如果发⽣崩溃,则⾸先检查 checkpoint 记录,使⽤相应的 redo log 进⾏数据和 undo log 的恢复,然后查看 undo log 的状
态发现事务尚未提交,然后就使⽤ undo log 进⾏事务回滚。事务执⾏ COMMIT 操作时,会将本事务相关的所有 redo log 都进⾏落
盘,只有所有 redo log 落盘成功,才算 COMMIT 成功。然后内存中的数据脏⻚继续按照 checkpoint 进⾏落盘。如果此时发⽣了崩
溃,则只使⽤ redo log 恢复数据。
17. 让你设计⼀个索引,你会怎么设计?
mysql 默认存储引擎 innodb 只显式⽀持 B 树索引,对于频繁访问的表, innodb 会透明建⽴⾃适应 hash 索引,即在 B 树索引
基础上建⽴ hash 索引,可以显著提⾼查找效率,对于客户端是透明的,不可控制的,隐式的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全干程序员demo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值