高频面试题 - 数据库
(3) 存储引擎的 InnoDB与MyISAM区别,优缺点,使用场景
-
主要区别:
1).MyISAM是非事务安全型的,而InnoDB是事务安全型的。
2).MyISAM锁的粒度是表级,而InnoDB支持行级锁定。
3).MyISAM支持全文类型索引,而InnoDB不支持全文索引。
4).MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
5).MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
6).InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。 -
应用场景:
1).MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
2).InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能
(5) 索引类别(B+树索引、全文索引、哈希索引)、索引的原理
https://blog.csdn.net/v_victor/article/details/52232685
(7) 为什么要用 B+tree作为MySQL索引的数据结构
- 文件很大,不可能全部存储在内存中,故要存储到磁盘上
- 索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使用B-/+Tree,还跟磁盘存取原理有关。)
- 局部性原理与磁盘预读,预读的长度一般为页(page)的整倍数,(在许多操作系统中,页得大小通常为4k)
- 数据库系统巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入,(由于节点中有两个数组,所以地址连续)。而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性
http://www.cnblogs.com/tiancai/p/9024351.html
(9) 遇到过索引失效的情况没,什么时候可能会出现,如何解决
https://blog.csdn.net/colin_liu2009/article/details/7301089
- 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
- 注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
- 对于多列索引,不是使用的第一部分,则不会使用索引
- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
(10) 如果建了1个单列索引,查询的时候查出2列,会用到这个单列索引吗?(会用到)
- 会用到
(11) 如果建了1个包含多个列的索引,查询的时候只用了第1列,能不能用上这个索引?查三列呢?
可以,查询第三列不可以必须按照顺序进行条件
(12) 接上题,如果where条件后面带有1个 i + 5 < 100 会使用到这个索引吗?
不会
(13) like %aaa%会使⽤索引吗? like aaa%呢?
- 不会 会
(15) 聊下优化过的索引,怎么优化;
https://www.cnblogs.com/yyjie/p/7486975.html
(24) 数据库事物ACID(原子性、一致性、隔离性、持久性)
- 原子性:原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生
- 一致性:一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
- 隔离性:多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果
- 持久性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
(26) 事物的隔离级别(读未提交、读以提交、可重复读、可序列化读)
https://my.oschina.net/bigdataer/blog/1976010
- Read uncommitted 读未提交:事务B读取了事务A尚未提交的数据,可能出现脏读
- Read committed 读提交:事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变,避免了脏读,但是可能会造成不可重复读
- Repeatable read 重复读: ,避免了不可重复读,但还有可能出现幻读。注:MySQL的默认隔离级别就是Repeatable read。
- Serializable 序列化:Serializable是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。
(35) limit 20000 加载很慢怎么解决
http://uule.iteye.com/blog/2422189
(36) 如何选择合适的分布式主键方案
- redis的自增
- oracle数据库的序列
- 手动UUID
- 推特雪花算法
(38) 说说 SQL 优化之道
https://blog.csdn.net/zly9923218/article/details/51007554
(40) 数据库高并发下的优化思路;
- 代码中sql语句优化
- 数据库字段优化,索引优化
- 加缓存,redis/memcache等
- 主从,读写分离
- 分区表
- 垂直拆分,解耦模块
- 水平切分
(54) mysql优化课程:[http://www.imooc.com/learn/194]