今日头条面试题
作者:Lucas
关注我,学习更多Java相关知识。领取更多Java资料
1.mysql为什么要用b+树,不用平衡二叉树做索引结构?
- B+树的高度一般为2-4层,所以查找记录时最多只需要2-4次IO,相对二叉平衡树已经大大降低了
- 范围查找时,能通过叶子节点的指针获取数据。例如查找大于等于3的数据,当在叶子节点中查到3时,通过3的尾指针便能获取所有数据,而不需要再像二叉树一样再获取到3的父节点。
2.创建数据库索引应该怎么考虑?
- 索引字段如果是CHAR或者VARCHAR时,索引的length可以小于字段的实际长度。但是如果字段的类型是BLOB和TEXT时,必须指定length。
- 经常与其他表链接的表,在链接字段应创建索引 on 两边的字段,都要建立索引
- 经常出现在where子句中的字段,尤其是大表,应创建索引 -对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 -应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,我们可以给存在字段默认值使其能够查询的时候命中索引。例如:where number is null 应使用:where number = 0,其中0则是number的默认值。也就是null值得替代者
- 应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描 -应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
3.使用int 做primary key和使用string 有什么优劣?
- int 相比varchar、char、text使用更少的存储空间,而且数据类型简单,可以节约CPU的开销,更便于表结构的维护 -默认都会在主键上建立主键索引,使用整形作为主键可以将更多的索引载入内存,提高查询性能 -对于InnoDB存储引擎而言,每个二级索引都会使用主键作为索引值的后缀,使用自增主键可以减少索引的长度(大小),方便更多的索引数据载入内存 -可以使索引数据更加紧凑,在数据插入、删除、更新时可以做到索引数据尽可能少的移动、分裂页,减少碎片的产生(可以通过optimize table 来重建表),减少维护开销
-在数据插入时,可以保证逻辑相邻的元素物理也相邻,便于范围查找
** PS: 高并发情况下使用自增Int,有可能造成锁的争用问题 **