- 具有哪些MySQL调优的经验?
- 主要是索引优化
- partition
- 位存储
- 哈希化存储
- 数据库事务的隔离级别有哪些?
- 如果在不加隔离性限制的情况下,在并发的情况下,数据库事务可能会出现脏读、不可重复读和幻读这些问题。脏读指的是一个事务读到了另一个事务未提交的事务。不可重复读指的是一个两次读的事务过程中经历了其他事务的写操作。幻读指的是一个先写后读的事务中经历了其他事务的写操作。
- READ_UNCOMMITTED:读未提交,无法避免脏读、不可重复读和幻读,一致性太差,基本不用
- READ_COMMITED:读已提交,可以避免脏读,但不可避免不可重复读和幻读,这是oracle的默认隔离级别
- REPEATABLE_READ:可重复读,可避免脏读和不可重复读,但是不可避免幻读,这是mysql的默认隔离级别
- SERLALIZABLE:串行化,可以避免脏读、不可重复读和幻读,但是性能差,基本不用
- innodb为什么推荐使用自增做主键?
- 使用自增主键,每次插入新的记录,会顺序添加到当前索引节点的后续位置,索引结构紧凑。每次插入新的记录,不需要移动已有的数据,效率高。
- 使用非自增主键,每次插入主键的值近似于随机,为插入新记录需要移动已有的数据,开销增加,频繁地移动,频繁地页分裂,造成内存碎片,索引结构不够紧凑。
- binlog有哪几种格式?
- statement、row、mixed
- 数据同步的时候选哪一种?mixed
- 为什么mysql5.6之后的版本不推荐用mixed?因为row的方式经过了优化,足以应对各种场景。
- 聚簇索引与非聚簇索引有什么区别?
- 聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,但有指向对应数据块的指针。
- 一般主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引
- MYISAM引擎使用的是非聚簇索引,INNODB的主键索引使用的是聚簇索引,二级索引使用的是非聚簇索引。
- 分库分表的方案是什么?算法用的什么算法?有哪些中间件?
- 分库:按照业务,不同的业务放到不同的库里,隔离系统的变化点,鸡蛋不放到一个篮子里
- 分表有横向切分和纵向切分
- 算法最好用一致性哈希算法
- 分库分表的中间件有MyCat、sharding-jdbc等等
- 为什么like模糊查询的时候,“xxx%”会走索引,而“%xxx”和“%xxx%”不走索引?
- 最左匹配原则
- B+ Tree 构建的索引树是从左到右有序的,关键字匹配的时候,是从左到右匹配的。而如果用“%xxx”表示前面的前缀不确定,不确定的话就不能按序匹配,只能全表扫描。
- 大数据量高并发场景下,数据库扣减库存引发的数据不一致问题如何解决?加上原有库存的比较,若没变,才允许设置成功,有点乐观锁的思想。
- mysql的乐观锁和悲观锁是怎么实现的?
- mysql的乐观锁最常用的手段是使用版本控制。
- 悲观锁就是打开事务。事务开启时,如果sql语句走索引,用行锁;如果sql语句没有走索引,用表锁。
- select … for update 这是排他锁,悲观锁。