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
索引,可以显著提⾼查找效率,对于客户端是透明的,不可控制的,隐式的。