mysql面试题

1.mysql的索引有哪些?

b+树索引,hash索引,全文索引

2.myisam索引和innodb索引的区别是什么?
myisam叶子节点存储的是地址,根据地址去找着一行数据,数据和索引是分开存储的;
innodb叶子节点,如果是聚簇索引,存储的这条数据本身,如果是非聚簇索引,那么存储的是主键,根据主键进行回表操作。

3.一个表中没有创建索引,还会创建b+树吗?

会的,如果表中有主键,那么会创建聚簇索引,b+树也生成了,

如果没有主键,那么会默认创建一个隐式的rowId,但是无法在外部使用

4.说一下b+树索引实现原理(数据结构)?

他由一页一页组成的,每一页16k大小,

在b树的时候,每一页存主键和这一行的数据,

在b+树的时候,每一页存主键或者其他索引的值,在叶子节点的时候,存这一行的数据

5.聚簇索引和非聚簇索引b+树实现有什么区别?

聚簇索引:
  索引和数据保存在一个b+树里面;
 页内的数据,按照主键的大小,排成一个单向链表;
  页和页之间是按照页内的主键大小排成的一个双向链表;
  非叶子节点存储的是主键+页号
  叶子节点存储的是这一行的数据

非聚簇索引:
  只有索引值和主键保存在b+树里面
  页内的记录是按照索引列的大小排成一个单向链表;
  页和页之间是按照页内索引列的大小排成的双向链表;
  非叶子节点存储的是索引的值和页号;
  叶子节点存储的是索引列的值,和主键,需要回表查询。

6.说一下b+树中聚簇索引的查找(匹配)逻辑?
比如说最顶级的页中我有一个主键是20,我去查询,这个页中有1和100,两个主键,
那么20 大于1,小于100,会去1这个主键对应的页去找一个页中的数据,依次匹配,
直到叶子节点,如果找到了,就返回这行数据,如果没有找到,就返回空

7.说一下b+树中非聚簇索引的查找(匹配)逻辑?
比如一个索引值4,去页中查找匹配4的值,如果小于等于4,就往索引值对应的页走,一直走到叶子节点发现了2条主键,那么就根据这2个主键,再次进行回表操作。
如果是字符串,会转换成ascii码,进行匹配。
如果是联合索引的话,会根据最左原则来匹配。

8.平衡二叉树,红黑树,b树,b+树的区别?
平衡二叉树:就是树的高度不会超过1,保证平衡,只适合少量的数据,数据越多,自旋的次数越多;
红黑树:分为红黑2个节点,最多3次旋转就能保证平衡,红黑树的长子树,不超过短子树的2倍即可;
b树叶子节点存储的是索引和数据;
b+数叶子节点,如果是聚簇索引存储的是这一行数据,如果是非聚簇索引存储的是主键;

9.一个b+树大概能存放多少条索引记录?
假如一条数据占10个字节,那么16k/10个字节=16000/10=1600条数据;
那么一个3级的b+树就是:16*1600*1600=40960000=4000万条数据 

10.使用b+树存储的索引crud执行效率如何?
新增:logn*n
修改:logn*n
删除:logn*n    
查询:logn*n    
 

11.什么是自适应哈希索引?
自适应哈希索引是innodb引擎的一个特殊功能,当他注意到某些索引被使用的非常频繁时,会在内存中
基于b-tree所有之上在创建一个哈希索引,这就让b-tree索引也具有哈希索引的一些优点,比如快速哈希查找,
这是一个完全自动的内部行为,用户无法控制或配置;

12.什么是2-3树,什么是2-3-4树?
2-3树就是,在根节点有2个子节点,在子节点下面有3个子节点;
2-3-4树就是,在根节点下面有2个子节点,在子节点下面有3个子节点,在子节点下面有4个子节点;

13.说一下自增主键和字符串类型主键的区别和影响?
自增主键能够维持底层数据的顺序写入,读取可以由B+树的二分查找定位,支持范围查找,范围数据自带顺序;
字符串无法完成以上的操作;

14.使用int自增主键后 最大id是10,删除id 10和9,在添加一条记录,最后添加的id是几?删除后重启mysql,然后添加一条记录最后id是几?
如果没有重启,按照删除之前最大的id自增,所以是11;
如果重启了,按照表里面最大的自增,所以是9;
可以通过表结构的AUTO_INCREMENT来看到;

15.索引的优缺点是什么?
优点
   聚簇(主键)索引:顺序读写,范围快速查找,范围查找自带顺序;
  非聚簇索引: 条件查询避免全表扫描,范围,排序,分组查询返回行id,排序分组后,在回表查询完整数据,有可能利用顺序读写,覆盖索引不需要回表操作;

缺点
  索引的创建,在空间和时间上都会有消耗;
  在空间上:每次创建一个索引,就会创建一个b+树;
  在时间上:每次增删改,都需要修改各个b+树索引;

16.使用索引一定能提升效率吗?
不一定,如果我的表里面只有5行数据,那么没必要建索引;
如果索引字段过多,那么增删改,效率也不高;
如果设置的唯一索引,那么在插入的时候,会去先校验一下,是否存在,也会影响性能;

17.如果是大段文本内容,如何创建(优化)索引?
第一种方式是分表存储,然后创建索引;
第二种方式是使用es为大文本创建索引;
 

18.什么是聚簇索引?
聚簇索引就是数据和索引放在一个b+树里面,也叫主键索引;

19.一个表可以有多个(非)聚簇索引吗?
一个表只能有一个聚簇索引,可以有多个非聚簇索引;

20.聚簇索引与非聚簇索引的特点是什么?
聚簇索引:
索引和数据都在一个b+树里面;
页内的数据按照主键的大小,排成一个单向的链表;
页与页之间的数据按照页内的数据,排成一个双向的链表;
非叶子节点存储的是主键和页号;
叶子节点存储的是这一行的数据;

非聚簇索引:
只有索引和主键保存在b+树里面;
页内的数据按照索引的值大小,排成一个单向链表
页与页之间的数据按照页内的索引值,排成一个双向链表;
非叶子节点存储的是索引的值和页号;
叶子节点存储的时候主键的值,然后需要通过回表,查询完整的数据;
 

21.curd时聚簇索引和非聚簇索引的区别是什么?
聚簇索引插入新值,比采用非聚簇索引插入新值的速度要慢很多,因为要保证主键不能重复;
聚簇索引范围,排序查找效率高,因为是有序的;
非聚簇索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据;

22.非聚簇索引为什么不存储数据地址值,而存储主键?
因为聚簇索引中有时会引发分页操作,重排操作,数据由可能会移动; 

23.什么是回表操作?
select * from biao where age>20;
第一次找到所有大于20的id;
第二次拿着id 去再次查询一遍,这就叫回表;

24.什么是覆盖索引?
select age from biao where age>20;
查询后拿到了所有的age,不需要在次去查询,那么这就是覆盖索引;

25.非聚簇索引一定回表查询吗?
不一定,只要b+树中包含的字段(创建索引的字段),覆盖(包含)想要的select的字段,那么就不会回表查询了

26.为什么要回表查询?直接存储数据不可以吗?
为了控制非聚簇索引的大小

27.如果吧一个Innodb表的主键删掉,是不是就没有主键,就没办法进行回表查询了?
还可以进行回表查询,因为Innodb会生成一个隐藏的rowid来进行辅助回表查询

28.什么是联合索引,组合索引,复合索引?
其实都是一个意思,就是把name,pwd组合到了一块,创建了一个b+树,
然后再查询的时候,where name=? and pwd=? 一定要以name开头,顺序不能乱,
因为b+树,是name开头的前缀,要匹配最左原则,否则无法命中索引 

29.复合索引创建时,字段顺序不一样,使用效果一样吗?
不一样,如果在查询的时候,没有按照最左匹配原则,无法命中索引,索引会失效。
 

30.什么是唯一索引?
就是在这个字段内,只能出现一次; 

31.唯一索引是否影响性能?
会影响,因为在插入之前,会先查询一遍是否存在;

32.什么时候使用唯一索引?
例如:身份证号,学号,账号,卡号可以作为唯一索引;

33.什么时候适合创建索引,什么时候不适合创建索引?
适合创建索引:频繁作为where条件查询字段,关联字段,排序字段,分组字段,统计字段;
不适合创建索引:频繁更新的字段,where 分组 排序 中用不到的字段,可以确定表数据非常少,参与msql函数计算的列;

34.什么是索引下推?
select name ,age from user where name like '张%' and age=18;
如果没有使用索引下推,那么会先根据name查询一次,然后回表,在根据age查询一次,然后回表,一共进行了2次回表;
如果使用了索引下推,那么会根据name和age进行一次查询,一次回表;
使用索引下推就是为了减少回表操作;

35.有哪些情况会导致索引失效?
计算函数,like %开头,没有匹配最左原则,数据量较少的情况,不等于(<>,!=),is not null,类型转换(字段是varchar,查询没有加单引号)

36.为什么like以%开头索引会失效?
并不一定会失效,例如select *的时候会失效,
select name的时候不会失效,这时会使用到覆盖索引,
索引会失效的原因是他查询了全表,在b+树里面,不知道你这个%到底是什么,所以会失效。
 

37.一个表有多个索引的时候,能否手动选择使用那个索引?
可以,使用force index(索引名) 来强制指定
 

38.如何查看一个表的索引?
show index from 表名,或者使用explain sql语句;

39.能否查看到索引选择的逻辑?是否使用过optimizer_trace?
开启
set session optimizer_trace="enabled=on",end_markers_in_json=on;
查看
select * from information_schema.OPTIMIZER_TRACE;
关闭
set session  optimizer_trace="enabled=off";

40.多个索引优先级是如何匹配的?
每一个索引都会有一个cost,cost值越低,选择的机会就越高,
主键索引-》唯一索引-》单值匹配-》全值匹配-》最左前缀匹配-》范围匹配-》索引扫描-》全表扫描;

41.使用order by时能否通过索引排序?
没有使用where 条件或者limit 限制5个以内的数,索引不生效

42.通过索引排序内部流程是什么?
通过索引过滤,筛选到需要排序的字段+其他字段;
判断索引内容是否覆盖select的字段;
如果覆盖索引,select的字段和排序都在索引上,那么在内存中进行排序,排序后输出结果;
如果索引没有覆盖查询字段,接下来计算select的字段是否超过max_length_for_sort_data限制;
如果超过,启动双路排序,否则使用单路排序;

43.什么是双路排序和单路排序?
单路排序:一次性取出所有的字段进行排序,内存不够用的时候,会使用磁盘;
双路排序:取出排序字段,进行排序,排序完成后,再次回表查询,所需要的其他字段;

44.group by分组和order by在索引使用上有什么区别?
group by 不需要过滤条件,就可以使用索引;
order by 必须要加过滤条件,才能使用索引;

45.如果表中有字段为null,又被经常查询,该不该给这个字段创建索引?
该创建索引,在查询的时候,使用is null做判断。
 

46.有字段为null,索引是否会失效?
不会

47.mysql内部支持缓存查询吗?
mysql5.7支持缓存,8.0之后就废弃掉了

48.mysql8.0为啥废弃缓存查询?
sql必须完全一致才会导致cache命中;
为了节省内存空间,太大的结果集不会被cache;
mysql缓存在分库分表环境下是不起作用的;
执行sql里有触发器,自定义函数时,mysql缓存也是不起作用的;
在表的结构或者数据发生改变时,基于该表相关cache立即全部失效;

49.mysql不用缓存,替代方案是什么?
使用redis

50.mysql内部有哪些核心模块组成,作用是什么?
第一部分:连接管理,第二部分:解析与优化,第三部分:存储引擎

51.说一下mysql,执行一条查询语句的,内部执行过程?
mysql客户端与服务器建立连接-》通过sql接口发送sql语句-》进行语法解析-》生成解析树-》预处理-》生成新的解析树-》查询优化器-》生成执行计划-》查询执行引擎

52.mysql提示不存在此列,是执行到那个节点报出的?
解析器分析sql语法的时候检查的列

53.如果一张表创建了多个索引,在那个阶段或者模块进行的索引选择?
查询优化器

54.mysql支持那些存储引擎,默认使用那个?
通过命令:show ENGINES;可以查看;
在5.7之前使用Myisam,在5.7以后使用Innodb

55.mysql8.0自带那些存储引擎?分别是做什么的?
通过命令:show ENGINES;可以查看到下面的信息;
MEMORY:基于哈希,存储在内存中,用于临时表
MRG_MYISAM:相同MyISAM表的集合
CSV:CSV存储引擎
FEDERATED:联合MySQL存储引擎
PERFORMANCE_SCHEMA:性能架构
MyISAM:读取和插入速度比较快
InnoDB:支持事务、行级锁定和外键
BLACKHOLE:存储引擎(写入其中的任何内容都会消失)
ARCHIVE:存档存储引擎

56.mysql存储引擎架构了解吗?
主要分为内存结构和磁盘结构两大部分;

57.能否单独为一张表设置存储引擎?
可以,使用navicat,设计表-》选项-》引擎切换,点击保存,
也可以在My.cnf配置,也可以在创建表的sql语句设置,还可以通过alter table进行修改;

58.阿里,京东等大厂都有自研的存储引擎,如何开发一套自己的?
可以把源码进行修改,但是达不到高效

59.Myisam和Innodb的区别是什么?
Innodb支持行锁,事务,外键;
Myisam不支持;
Myisam在查询的时候性能好;
Innodb在写的时候性能好;

60.具体说一下如何做技术选型?
如果没有写操作,都是高频的读操作,那么可以使用Myisam,否则使用Innodb;
 

61.什么是数据库事务?事务的特性是什么?
事务就是要么操作都成功,要么都失败,事务的特性就是ACID

62.什么是ACID?
原子性:要么都成功,要么都失败;
一致性:数据在事务中,不能进行其他的修改操作,否则会影响数据的正确性
持久性: 事务一旦被提交,这条数据的结果就被永久的保存到磁盘上了
隔离性: 一个事务内操作的数据,不会被另一个事务所干扰

63.并发事务会有那些问题?
脏读,不可重复读,幻读,丢失修改

64.什么是脏读?
数据库有一个age字段是18,有2个客户端,一个客户端开启事务,进行修改为20,但是还没有提交事务,
这个时候,另一个客户端,查询发现age变成了20,这就是脏读

65.什么是修改丢失?
数据库有一个age字段是10,第一个客户端开启事务,进行+2操作,第二个客户端开启事务,进行+5操作,
这时候,第一个先提交,第二个在提交事务,这时候,age变成了15,第一个客户端丢失了那条修改的时候,第二个客户端覆盖了前面的数据,这就是丢失修改

66.什么是不可重复读?
就是在一个事务中for循环读取这个sql,另一个客户端对这个sql就行了修改,然后第一个事务再次读取的时候,发现数据已经发生了变化,这就是不可重复读

67.什么是幻读?
幻读和不可重复读类似,幻读是读取的受影响行数发生了变化,第一个事务一直读取这个count(id),第二个事务新增了一条,那么第一个再读的时候,就是数据多了一行,这就是幻读

68.不可重复读和幻读的区别?
幻读影响的是行数,不可重读发影响的是这一条数据的修改;

69.mysql是如何避免事务并发问题的
在mysql内部通过加锁的方式实现好了解决方案可供选择,就是配置事务的隔离级别;


70.什么是事务隔离级别?
读取未提交:可以读别的事务还没有提交的数据,会产生脏读,会产生不可重复读,会产生幻读 ;
读取已提交(不可重复读): 同一条sql多次,读取到别人已经提交好的不同的数据, 不会产生脏读,但是会产生幻读;
可重复读:就是同一条sql多次查询,结果是一样的,不会产生脏读,不会产生不可重复读,不会产生幻读,通过next-key锁已经解决了幻读;
可串行化:必须前一个事务完成了,才能进行当前的事务,否则会一直阻塞, 不会产生脏读,不可重复读,幻读,隔离级别最高;


71.mysql默认的隔离级别是什么?
可重复读(repeatable-read);


72.如何选择事务隔离级别?
默认使用可重复读,如果在高频的读写要求一致性比较高的话,选择隔离级别比较高的,或者使用可串行化的级别;


73.靠缓存可以提示高事务隔离级别的性能吗?
不会,缓存只能提高读的性能,但是不能提高写的性能;

74.mysql事务隔离是如何实现的?
主要是读写锁和MVCC,MVCC主要控制行锁和间隙锁,next-key锁

75.什么是一致性非锁定读和锁定读?
innodb存储引擎实现了两种标准的行级锁:S锁和X锁;

S锁叫共享锁,读锁:允许其他事务读取数据,但是其他事务不能修改和删除数据, 可以在其他事务加S锁(共享锁),但是不允许其他事务加X锁(排它锁);
X锁也叫排他锁,写锁:允许其他事务读取数据,但是其他事务不能修改和删除数据,不能在其他事务加任何锁;

一致性非锁定读指的是:允许并发事务在修改的时候,读取到老版本的数据的,通过MVCC多版本控制;
一致性锁定读指的是:一个事务可以通过select 语句给某条记录加X锁(排他锁)或者S锁(共享锁);

76.说一下MVCC内部细节?
MVCC就是多版本并发控制,是为了在读取数据的时候,不加锁来提高读取效率和并发性的一种手段;

mvcc解决的就是读写时的线程安全问题,线程不用去争抢读写锁;
mvcc的读是快照读,也就是select语句,快照读在读写时不用加锁,可能会读取到历史数据;
还有一种读取数据的方式是当前读,他会对当前读取的数据进行加锁,所以读取到的数据都是最新的;
原子性通过undo log来实现;
持久性通过redo log来实现;
隔离性通过加锁(当前读),MVCC的快照读实现;
一致性通过undo log,redo log,隔离性共同实现;

MVCC的实现依赖于:隐藏字段,Read View,undo log;

隐藏字段:事务id,和回滚指针;
事务id:每进行一次事务操作,就会自增1;
回滚指针:记录上一个版本的数据,结合undo log来实现回滚;

Read view:在select读取的时候,会有多个版本的数据,我们可以通过Read view 来知道读取的是哪个版本的;

undo log:就是历史的记录;


77.Mysql事务一致性,原子性是如何实现的?
通过MVCC的undo log来实现原子性;
通过MVCC的 undo log,redo log,隔离性来实现一致性;


78.mysql事务的持久性是如何实现的?
主要是通过Redo log保证了事务的持久性,在写数据之前,先写日志,出现断电重启后,可以通过Redo log来恢复;

79.表级锁和行级锁有什么区别?
表级锁:整个表加锁,并发能力下降,一般用于创建表,修改表,删除表时使用;
行级锁:锁一行的数据,其他行的数据不受影响,并发能力强;

80.什么是行级锁?mysql如何完成的?
行级锁就是锁一行数据,其他行不受影响,是由MVCC来完成的;

81.什么是共享锁(读锁)?
共享锁也叫S锁,加锁方式select * form 表 lock in share mode ,其他事物可以加共享锁,但是不能加排他锁,
其他事物不能进行修改和删除,只能查询;

82.什么是排他锁(写锁/独占锁)?
排他锁也叫X锁,加锁方式select * from 表 for update ,其他事物不允许加锁,
其他事物不能进行修改和删除,只能查询

83.什么是意向锁?
意向锁就是读写锁前面加了一个I,分为意向共享锁(IS),意向排它锁(IX),意向锁也属于表锁,主要是为了提高加表锁的效率;
对整个表添加共享锁前,需要先获得IS锁(意向共享锁);
对整个表添加排他锁之前,需要先获取IX锁(意向排他锁);


84.Innodb支持那几种锁?
表锁,行锁,间隙锁,next-key锁(用于解决幻读)

85.当前读和快照读分别是什么?
当前读就是锁定读,每次读取都是最新的数据;
快照读就是可以读取到历史版本的数据,由MVCC来控制;

86.什么是XA协议?
XA协议是一个通用的两阶段提交协议(2pc),XA协议定义了三个角色;
资源管理器(RM):就是数据库;
事物管理器(TM): 协调参与全局事物中的各个事物,和所有资源管理器进行通信;
应用程序(AP):访问RM的应用程序,并通过接口访问TM,提交和结束分布式事物;
第一个阶段是prepare阶段:准备就绪进入提交,未就绪进入回滚阶段
第二个阶段是commit阶段:提交就是提交事物,回滚就是回滚数据;


87.什么是mysql xa事物?
xa事物分为内部和外部事物;
内部xa事物:mysql维护binlog日志和innodb的redo log,为了保证两个日志的一致性,当事物提交时,innodb会先做一个prepare操作,讲操作的xid写入,
然后进行二进制日志的写入;
外部xa事物:用于分布式事物,通过start,end,prepare,commit这些命令,完成分布式事物的状态转移;

88.xa事物与普通事物区别是什么?
xa事物可以跨库或者服务器,属于分布式事物,同时xa事物还支撑了innodb内部日志两阶段纪录;
普通事物只能在单库执行;


89.什么是2pc,3pc?
2pc就是两阶段提交协议,分为prepare阶段和commit阶段;
第一个阶段是prepare阶段:准备就绪进入提交,未就绪进入回滚阶段
第二个阶段是commit阶段:提交就是提交事物,回滚就是回滚数据;

3pc就是三阶段提交协议,分为cancommit阶段,precommit阶段,docommit阶段;
cancommit:判断是否可以提交,如果可以提交,那么进入预提交阶段,如果不能提交,那么中断事物;
precommit:这个阶段是预提交,都确认预提交成功后,才进入真正的提交阶段;
docommit: 这个阶段就是真正的事物提交了,根据之前的响应来判断是执行提交,还是中断事物。

3pc比2pc多个一个阶段,减少同步阻塞的发送范围,还引入了超时机制;

90.是否使用过select for update?会产生那些操作?
使用过,会产生排他锁(也叫x锁,也叫独占锁),其他事物只能查询,不能进行删除和修改,以及加任何锁操作;

91.说一下mysql死锁的原因和处理方法?
当2个事物,都在修改这一条sql时候的,就会产生死锁;

查看错误日志;
查看正在运行的任务,show full processlist, 可以看到产生死锁的sql,使用kill id杀死进程;
查看当前运行的事物:SELECT * from information_schema.INNODB_TRX,可以看到锁状态,和sql语句;

死锁无法避免,上线前进行压力测试,拆分sql,严禁大事物,使用索引优化sql;


92.mysql会产生几种日志?
bin log(二进制日志),redo log(重写日志),undo log(回滚日志),错误日志(error log),慢查询日志,(slow query log),一般查询日志;

93.bin log作用是什么?
bin log就是增量日志,先执行undo log,在执行redo log,最后把sql语句写入bin log(二进制日志)中,用于数据库文件丢失的灾备恢复(恢复数据),
还可以做主从同步;

94.redo log作用是什么?
当数据提交事物后,用来持久化数据到磁盘,当系统断电后,用来恢复数据;

95.undo log作用是什么?
纪录历史的数据,用来回滚数据;

96.mysql日志是否实时写入磁盘?
一般不会实时写入,磁盘实时写入是比较慢的;

97.bin log刷盘机制是如何实现的?
通过sync_binlog;
sync_binlog=0的时候,每次提交事物,binlog不会马上写入到磁盘,而是先写到page cache,
写page cache要快的多,在mysql 崩溃的时候会有丢失日志的风险;

sync_binlog=1的时候,每次提交事物都会执行fsync写入到磁盘;

sync_binlog大于1的时候,每次提交事物都先写page cach,等到积累了n个事物之后才fsync写入到磁盘,
在mysql崩溃的时候会有丢失日志的风险;

三种模式下,sync_binlog=1是强一致的选择,选择0或者N的情况下,极端的情况下就会有丢失日志的风险;

98.redo log刷盘机制是如何实现的?
设置变量innodb_flush_log_at_trx_commit来提供刷盘策略,有三个值;
0:事物提交后redo log buffer不写入page cache,由后台线程每秒写入page cache然后调用fsync写入到磁盘;
1:事物提交后把redo log buffer的数据写入page cache,并等待page cache写入磁盘在返回;
2:事物提交后会把redo log buffer的数据写入page cache并返回;

值为0时,性能最好,如果mysql宕机,都会丢失1秒的数据;
值为1时,性能最差,安全性最好,mysql宕机不会丢失数据;
值为2时,性能次之,mysql宕机不会丢数据,因为数据已经写入age cahe,如果操作系统宕机,则会丢失1秒的数据;

99.undo log刷盘机制是如何实现的?
undo log不会进行刷盘,undo log只用于数据的回滚,并不是宕机恢复的必要条件;


100.mysql的binlog有几种录入格式?分别有什么?
statement:每一条修改的sql都会纪录到binlog中,如果使用了函数不会被纪录,比如说master的uuid,到了slave就是另一个uuid;
row: 每一行的改动都会纪录,日志量太大;
mixed: 就是statement和row的结合,系统自动判断使用那个,一般的sql修改使用statement,如果无法准确完成主从复制,那么使用row;

101.mysql集群同步为什么使用binlog?优缺点是什么?
binlog日志,所有存储引擎都可以用,支持增量同步,还可以提供其他中间件读取,比如同步到hdfs中;

如果复制表数据:不支持某个阶段回放,直接复制过程中一旦中断复制(比如断网),很难确定复制的offset;

102.可以使用mysql直接存储文件吗?
可以使用blob来存储二进制大对象;

103.什么时候存文件?什么时候不存文件?
存:需要高效查询并且文件很小的时候;
不存:文件比较大,数据量多或者变更频繁的时候;

104.存储文件的时候有遇到过什么问题吗?
上传数据过大sql执行失败,调整max_allowed_packet;
主从同步数据时比较慢;
应用线程阻塞;
占用网络带宽;

105.Emoji乱码怎么办?
使用utf8mb4;

106.mysql如何存储ip地址?
使用varchar或者int;
SELECT INET_ATON('127.0.0.1')可以把ip转换成数字;
SELECT INET_NTOA('2130706433')可以把数字转换成ip;

107.长文本如何存储?
使用text,longtext

108.大段文本如何设计表结构?
可以放入搜索引擎,或者分表存储,分表之后多段存储;

109.大段文本查找时如何建立索引?
全文检索,模糊匹配可以存放到搜索引擎中;
指定索引长度;
分段存储后创建索引;

110.有没有在开发中使用过text,blob数据类型?
使用过,在分布式事物的seata中blob用来纪录回滚数据;
text 用来纪录长文本,文章,小说,新闻,会议内容;


111.日期时间如何存储?
使用datetime,timestamp;

112.timestamp和datetime的区别是什么?
跨时区的业务使用timestamp,timestamp会有时区转换问题;
datetime原样输入,输出,不做任何改变;

113.为什么不使用字符串存储日期?
字符串无法完成数据库内部的范围筛选;
在大数据量存储优化索引时,查询必须加上时间范围;

114.如果需要使用时间戳timestamp和int该如何选择?
使用timestamp,但是要注意时区转换,timestamp的底层使用的也是int;

115.char与varchar的区别?如何选择?
char的优点是存储空间固定(最大255),没有碎片,存储读取速度快,缺点是数据量大的表,非固定长度属性使用char,空间浪费;
varchar字段,存储的空间根据存储的内容变化,缺点是读取和存储的时候,需要读取信息计算下标,才能获取完整内容;


116.财务计算有没有出现过错乱?
第一类:锁包括多线程,数据库,ui展示后超时提交等;
第二类: 应用与数据库浮点运算精度丢失;
应用开发问题:多线程共享数据读写;
丢失精度问题:使用decimal解决;
使用乘法替换除法;
使用事物保证acid特性;
更新时使用悲观锁 select  for update;
数据只有标记删除;
纪录详细日志方便溯源;


117.decimal与float,double的区别是什么?
float:4字节,浮点型;
double:8字节,双精度类型;
decimal: 数字型,不存在精度丢失;


118.浮点类型如何选型,为什么?
不丢失精度的计算使用decimal;
允许丢失精度的可以使用float,double;

119.预编译sql是什么?
mysql接到一条sql,通过占位符的方式,来把sql执行一次编译;
编译之后,把sql结果缓存起来;
同一条sql,参数不一样,达到复用的效果;


120.预编译sql有什么好处?
预编译sql会被mysql缓存下来;
作用域是每个session,对其他session无效,重新连接也会失效;
提高安全性防止sql注入;
编译语句有可能被重复调用,sql相同参数不同,在同一session中重复查询执行效率明细比较高;
 

121.子查询与join那个效率高?
join效率高

122.为什么子查询效率低?
在执行子查询的时候,mysql创建了临时表,查询完毕后在删除这些临时表,多了一个创建和销毁临时表的过程;
而join则不需要创建临时表,所以会比子查询快;

123.join查询可以无限叠加吗?mysql 对join查询有什么限制吗?
建议join不超过3张表关联,关联过多会占用更多内存空间,导致性能下降,最多可以关联61张表,超过就报错;

124.join查询算法了解吗?
snlj 简单嵌套循环连接;
inlj 索引嵌套循环连接;
bnlj 缓存块嵌套循环连接;

125.如何优化过多join查询关联?
增加冗余字段,减少关联查询;
小表join大表;
尽量使用inner join 让系统自动选择驱动表;
关联字段创建索引;
调整join buffer大小;

126.是否有过mysql调优经验?
对join关联的字段加索引;
查询*的,改成查询单个字段;
表结构设计不要设置那么大,要符合字段的长度;
通过explain排查sql是否索引失效;
加索引的字段,要遵循最左匹配原则;
通过mysqldumpslow排查慢sql日志;
分库分表;
大量的模糊搜索文本,可以放入搜索引擎中;

127.开发中使用过那些mysql调优工具?
explain ;
mysqldumpslow 慢查询使用;

128.如何监控线上环境中执行比较慢的sql?
开启慢sql查询日志,收集sql;

129.如何分析一条慢sql?
首先开启慢sql日志,默认是10秒,可以进行修改;
启用慢查询 set global slow_query_log='ON';
通过set long_query_time=1,来修改慢sql时间,只在当前会话(窗口)有效;
通过show variables like "%slow%",可以找到slow_query_log_file慢查询日志的位置;
然后在linux使用mysqldumpslow 来取出慢sql的日志信息;

130.如果查看当前sql使用了那个索引?
可以使用explain;

131.索引如何进行分析和调优?
使用explain分析索引,查看sql是否索引失效,然后按照不同的问题去解决;

132.explain关键字中的重要指标有哪些?
select_type:查询的类型;
table:那个表;
type:索引的类型;
key:实际使用的索引;
row:使用到索引的行数;
filtered:使用到索引的百分比;
extrea:索引执行情况;

133.mysql数据库cpu飙升的话你会如何分析?
使用top观察mysqld的cpu利用率;
使用pidstat定位到线程;
使用show profile观察sql各个阶段耗时;
服务器上是否运行了其他程序;
检查一下是否有慢查询;
使用pref top分析那些函数引发的cpu飙升;


134.什么是分库分表?
分库就是把不相关的数据放不同的库,例如订单放一个库,系统管理放一个库;
分表就是表结构相同,数据不同,比如按照租户id,取模算法,放入不同的表中;

135.什么时候进行分库分表?
当数据超过600万的时候,可以进行分库分表;


136.有没有配置es使用经验?
当我们的数据量大的时候,可以使用es,es的倒排索引可以对关键字查询速度非常快;

137.说一说分库分表工具的思路?
使用mycat伪装成mysql服务器,代理用户请求转发到真实服务器;
基于本地aop实现,拦截sql,改写,路由和结果归集处理;

138.用过那些分库分表工具?
mycat,sharding-jdbc,sharding-proxy;

139.分库分表后可能会有那些问题?
执行效率明显降低;
表结构很难再次调整;
引发分布式id问题;
产生跨库join;
代理类中间件网络io成为瓶颈;

140.说一下读写分离常见方案?
可以使用mycat,mycat伪装成一个mysql,可以连接不同的读写分离数据库;

141.什么是视图?为什么要使用视图?
视图就是一个虚拟的表,可以把特别长的sql放入视图中,
然后查询的时候不需要查询那么长的sql;

142.什么是存储过程,有没有使用过?
没有使用过,项目禁止使用存储过程,难于调试和扩展;

143.有没有使用过外键,有什么需要注意的什么地方?
使用过,要注意级联更新和删除,外键也会影响到数据库的插入速度;

144.用过processlist吗?
用过,通过show processlist查看;
可以看到用户,状态,sql语句,耗时,命令的一些信息;


145.某个表有数千万数据,查询比较慢,如何优化,说一下思路?
可以一次性查询出来,给到前端,重复利用;
可以放入缓存;
可以分库分表;
可以放入es;
可以通过explain排查sql的索引;
可以读写分离;
可以把关联的字段,做冗余;

146.count(列名)和count(*)有什么区别?
count(列名)不会统计null值;
count(*)会统计所有行;

147.如果有超大分页改怎么处理?
加索引,延迟关联,order by避免全表扫描,减少select字段;

148.mysql服务器毫无规律的异常重启如何排查问题?
排查日志,查看内存是否不够;

149.mysql线上修改表结构会有那些风险?
会锁表,导致无法读写,索引失效;

150.什么是mysql多实例部署?
就是一台机器上面部署多个mysql;

151.varchar 可以存多个字符

21844

152.主键自增到头了怎么办?

没遇到过,如果到头了,肯定会数据很多,所以我们会提前分库分表,避免主键自增到头

153.mysql索引失效

模:模糊查询LIKE以%开头
型:varchar类型的,去查询数字没有加单引号
数:对索引字段使用内部函数
空:索引列是NULL
运:索引列进行四则运算
最:复合索引不按索引列最左开始查找
快:如果查询全表比索引还快 那么索引会失效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值