mysql面试题

MySQL面试题记录不断更新中..

1 myisam和innodb的区别?

myisam引擎是5.1版本之前的默认引擎,支持全文搜索,压缩,空间函数等,但不支持事务和行锁,所以一般用于有大量查询和少量插入的场景,而且myisam不支持外键,并且索引和数据是分开的。

innodb是基于聚簇索引建立的,和myisam相反它支持事务,外键,并且通过MVCC来支持高并发,索引和数据是放在一起的。

2 锁的类型有哪些呢

mysql分为共享锁和排他锁,也就是读锁和写锁

读锁是共享的,可以通过lock in share mode 实现,这是只能读不能写

写锁是排他的,会阻塞其他的读写操作。按颗粒分,分为表锁和行锁

表锁会锁定整张表,阻塞其他用户对该表的所有读写操作,比如alter,delete,insert

行锁又分为乐观锁和悲观锁,悲观锁通过for update实现,乐观锁通过版本号实现

3事务的基本特性和隔离级别

事务基本特性ACID原则

A是原子性,要吗都成功,要吗都失败,通过回滚实现

C是一致性,数据总是从一个一致性状态到另外一个一致性状态,比如a转了100到B,失败了,事务会回滚,不会提交到数据库

I是隔离性,4种隔离级别

  读未提交,可以读取其他事务没有提交的数据,会导致脏读

  读已提交,只能读取一提交的事务,会导致不可重复读

  可重复读,该数据有事务,等待事务结束,会导致幻读,默认的隔离级别,通过MVCC多版本并发控制和间隙锁解决幻读,MVCC每次修改都会有两个版本(创建,过期)号来着,每次更新的时候都会加1,所以可以指定读取原本的版本,写写并发的数据异常

  序列化,不会产生任何问题,但性能低

4 分库分表

垂直分表和水平分表

垂直分表,例如按微服务来区分,用户,订单,

水平分表,每天1000万数据,可以支持3个月,超过就做归档,数量就是9亿分在1024张表,每张100万,可以通过hash(id)%1024取某

5 分表id怎么唯一性?

1设定步长,几张表就可以设定多少步长,导致不重复

2分布式id,使用开源雪花算法

3分表后,新增一个字段作为主键,例如用户id,订单号id

6 分表后非share_id怎么处理?

1可以使用mapping表,做映射表,例如维护用户id和商家id

2打宽表,一般而言,商户端对数据实时性要求并不是很高,比如查询订单列表,可以把订单表同步到离线(实时)数仓,再基于数仓去做成一张宽表,再基于其他如es提供查询服务。

3数据量不是很大的话,比如后台的一些查询之类的,也可以通过多线程扫表,然后再聚合结果的方式来做。或者异步的形式也是可以的。

7 mysql主从同步怎么做的?

首先先了解mysql主从同步的原理

1master提交完事务后,写入binlog

2slave连接到master,获取binlog

3master创建dump线程,推送binglog到slave

4slave启动一个IO线程读取同步过来的master的binlog,记录到relay log中继日志中

5slave再开启一个sql线程读取relay log事件并在slave执行,完成同步

6slave记录自己的binglog

8数据库优化方案?

三个方向:

1,数据库内核优化,一般专门人专门处理

2,my.cnf配合压力测试进行使用

3,sql语句优化

sql语句优化:

  1,使用缓存优化查询,多次相同的查询会放入缓存中,后续同样的查询会走缓存,但要避免缓存失效

  2,使用explian看sql语句查询是怎么走的,一般要配合业务

  3,使用索引,where后面字段可以配合,但数据量大不合适

  4,limit限制,特殊业务

  5,引擎类型的区别

  6,delete和insert大量时,需要拆分

  7,数据类型进行使用小的,因为磁盘存储越紧凑越快,同时查询速度int>verchar,enum也大于verchar

  8,固定长度

  9,避免使用selete *

 

 

  

posted @   黄易安  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示