21、什么时候不要使用索引?
1. 经常增删改的列不要建立索引;
2. 有大量重复的列不建立索引;
3. 表记录太少不要建立索引。
22、说说什么是 MVCC?
多版本并发控制(MVCC=Multi-Version Concurrency Control),是一种用来解决读 - 写冲突的无 锁并发控制。也就是为事务分配单向增长的时间戳,为每个修改保存一个版本。版本与事务时间戳 关联,读操作只读该事务开始前的数据库的快照(复制了一份数据)。这样在读操作不用阻塞写操 作,写操作不用阻塞读操作的同时,避免了脏读和不可重复读。
23、MVCC 可以为数据库解决什么问题?
在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数 据库并发读写的性能。同时还可以解决脏读、幻读、不可重复读等事务隔离问题,但不能解决更新 丢失问题。
24、说说 MVCC 的实现原理
MVCC 的目的就是多版本并发控制,在数据库中的实现,就是为了解决读写冲突,它的实现原理主 要是依赖记录中的 3 个隐式字段、undo 日志、Read View 来实现的。
25、MySQL 事务隔离级别?
- READ UNCOMMITTED(未提交读):事务中的修改,即使没有提交,对其他事务也都是可见 的。会导致脏读。
- READ COMMITTED(提交读):事务从开始直到提交之前,所做的任何修改对其他事务都是 不可见的。会导致不可重复读。这个隔离级别,也可以叫做“不可重复读”。
- REPEATABLE READ(可重复读):一个事务按相同的查询条件读取以前检索过的数据,其他事 务插入了满足其查询条件的新数据。产生幻行,会导致幻读。(MySQL 默认隔离级别)
- SERIALIZABLE(可串行化):强制事务串行执行。
26、 请说说 MySQL 数据库的锁?
关于 MySQL 的锁机制,可能会问很多问题,不过这也得看面试官在这方面的知识储备。
MySQL 中有共享锁和排它锁,也就是读锁和写锁。
1. 共享锁:不堵塞,多个用户可以同一时刻读取同一个资源,相互之间没有影响。
2. 排它锁:一个写操作阻塞其他的读锁和写锁,这样可以只允许一个用户进行写入,防止其他用 户读取正在写入的资源。
3. 表锁:系统开销最小,会锁定整张表,MyISAM 使用表锁。
4. 行锁:容易出现死锁,发生冲突概率低,并发高,InnoDB 支持行锁(必须有索引才能实现, 否则会自动锁全表,那么就不是行锁了)。
27、说说什么是锁升级?
MySQL 行锁只能加在索引上,如果操作不走索引,就会升级为表锁。因为 InnoDB 的行锁是加在索引上的,如果不走索引,自然就没法使用行锁了,原因是 InnoDB 是将 primary key index和相关的行数据共同放在 B+ 树的叶节点。InnoDB 一定会有一个 primary key,secondary index 查找的时候,也是通过找到对应的 primary,再找对应的数据行。 当非唯一索引上记录数超过一定数量时,行锁也会升级为表锁。测试发现当非唯一索引相同的 内容不少于整个表记录的二分之一时会升级为表锁。因为当非唯一索引相同的内容达到整个记 录的二分之一时,索引需要的性能比全文检索还要大,查询语句优化时会选择不走索引,造成 索引失效,行锁自然就会升级为表锁。
28、说说悲观锁和乐观锁
悲观锁
说的是数据库被外界(包括本系统当前的其他事物以及来自外部系统的事务处理)修改保持着保守 态度,因此在整个数据修改过程中,将数据处于锁状态。悲观的实现往往是依靠数据库提供的锁机 制,也只有数据库层面提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统汇总实 现了加锁机制,也是没有办法保证系统不会修改数据。 在悲观锁的情况下,为了保证事务的隔离性,就需要一致性锁定读。读取数据时给加锁,其它事务 无法修改这些数据。修改删除数据时也要加锁,其它事务无法读取这些数据。
乐观锁
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机 制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事 务而言,这样的开销往往无法承受。而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本(Version)记录机制实 现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过 为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对 此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果 提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
29、怎样尽量避免死锁的出现?
1. 设置获取锁的超时时间,至少能保证最差情况下,可以退出程序,不至于一直等待导致死锁;
2. 设置按照同一顺序访问资源,类似于串行执行;
3. 避免事务中的用户交叉;
4. 保持事务简短并在一个批处理中;
5. 使用低隔离级别;
6. 使用绑定链接。
30、使用 MySQL 的索引应该注意些什么?
31、CHAR 和 VARCHAR 的区别?
- CHAR 和VARCHAR 类型在存储和检索方面有所不同
- CHAR 列长度固定为创建表时声明的长度,长度值范围是1 到255当 CHAR 值被存储时,它们被用空格填充到特定长度,检索CHAR 值时需删除尾随空格。
32、主键和候选键有什么区别?
表格的每一行都由主键唯一标识,一个表只有一个主键。主键也是候选键。按照惯例,候选键可以被 指定为主键,并且可以用于任何外 键引用。
33、主键与索引有什么区别?
主键一定会创建一个唯一索引,但是有唯一索引的列不一定是主键; 主键不允许为空值,唯一索引列允许空值; 一个表只能有一个主键,但是可以有多个唯一索引; 主键可以被其他表引用为外键,唯一索引列不可以; 主键是一种约束,而唯一索引是一种索引,是表的冗余数据结构,两者有本
34、 MySQL 如何做到高可用方案?
MySQL 高可用,意味着不能一台 MySQL 出了问题,就不能访问了。
1. MySQL 高可用:分库分表,通过 MyCat 连接多个 MySQL
2. MyCat 也得高可用:Haproxy,连接多个 MyCat
3. Haproxy 也得高可用:通过 keepalived 辅助 Haproxy