14 个必须掌握的数据库面试题(附答案)
一、为什么使用数据索引能提高效率
■数据索引的存储是 有序的
■在有序的情况下, 通过索引查询一个数据是无需遍历索引记录的
■极端情况下,数据索引的查询效率为二分法查询效率,趋近于log2(N)
二、B+树索引和哈希索引的区别
B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接,是有序的,如下图:
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可,是无序的,如下图所示:
三、哈希索引的优势:
等值查询,哈希索引具有绝对优势(前提是:没有大量重复键值,如果大量重复键值时,哈希索引的效率很低,因为存在所谓的哈希碰撞问题。
四、哈希索引不适用的场景:
■不支持 范围查询
■不支持索引完成排序
■不支持联合索引的最左前缀匹配规则
五、什么是表分区?
表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成
六、表分区与分表的区别?
**分表:**指的是通过一定规则, 将一张表分解成多 张不同的表。比如将用户订单记录根据时间成多个表。
**分表与分区的区别在于:**分区从逻辑上来讲只有一张表 ,而分表则是将一张表分解成多张表。
七、表分区有什么好处?
1、存储更多数据。分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。和单个磁盘或者文件系统相比,可以存储更多数据
2.优化E询。在where语句中包含分区条件时,可以只扫描一个或多 个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。
3.分区表更容易维护。例如:想批量删除大量数据可以清除整个分区。
4.避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问, ext3问价你系统的inode锁竞争等。
八、在MVCC并发控制中,读操作可以分成两类:
**快照读(snapshot read):**读取的是记录的可见版本(有可能是历史版本),不用加锁(共享读锁s锁也不加,所以不会阻塞其他事务的写)
**当前读(currentread):**读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录
九、行级锁定的优点:
1、当在许多线程中访问不同的行时只存在少量锁定冲突。
2、回滚时只有少量的更改
3、可以长时间锁定单一的行。
十、行级锁定的缺点:
比页级或表级锁定占用更多的内存。 当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。 如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表,比其它锁定明显慢很多。 用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。
十一、MySQL优化
■开启查询缓存,优化查询
■explain你的select查询, 这可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN的查询结果还会告诉你你的索引 主键被如何利用的,你的数据表是如何被搜索和排序的
■当只要一行数据时使用limit 1, MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据
■为搜索字段建索引
■使用ENUM而不是VARCHAR
■Prepared StatementsPrepared Statements很像存储过程,是一种运行在后台的SQL语句集合,我们可以从使用
** prepared statements**获得很多好处,无论是性能问题还是安全问题。
** Prepared Statements**可以检查一些你绑定好的变量,这样可以保护你的程序不会受到“SQL注入式” 攻击
■垂直分表
■选择正确的存储引擎
十二、key和index的区别
key是数据库的物理结构,它包含两层意义和作用,一是约束(偏 重于约束和规范数据库的结构完整性) ,二是索引(辅助查询 用的)。包括primary key, unique key, foreign key等
index是数据库的物理结构,它只是辅助查询的,它创建时会在另外的表空间(mysql中的innodb表空间) 以-个类似目录的结 构存储。索引要分类的话,分为前缀索引、全文本索引等;
十三、Mysql 中MyISAM和InnoDB的区别有哪些?
1、InnoDB支持事务, MyISAM不支持 2. InnoDB支持外键,而MylSAM不支持。 对一个包含外键的InnoDB表转为MYISAM会失败; 3、InnoDB是聚集索引,数据文件是和索引绑在一起,必须要有主键,通过主键索引效率高。 4、InnoDB不保存 表的具体行数,执行select count(*) from table时需要全表扫描。 5、Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;
十四、数据库表创建注意事项
1.字段名及字段配制合理性
■剔除关系不密切的字段; 1字段命名要有规则及相对应的含义(不要一部分英文,一部分拼音,还有类似a.b.c这样不明含义的字段) ;
■字段命名尽量不要使用缩写(大多数缩写都不能明确字段含义) ;
■字段不要大小写混用(想要具有可读性,多个英文单词可使用下划线形式连接) ;
■字段名 不要使用保留字或者关键字;
■保持字段名和类型的一致性;
■慎重选择数字类型; 给文本字段留足余量;
2.系统特殊字段处理及建成后建议
■添加删除标记(例如操作人、删除时间) ;
■建立版本机制;
3.表结构合理性配置
■多型字段的处理 ,就是表中是否存在字段能够分解成更小独立的几部分(例如:人可以分为男人和女人) ;
■多值字段的处理,可以将表分为三张表,这样使得检索和排序更加有调理,且保证数据的完整性!
4.其它建议
■对于大数据字段,独立表进行存储,以便影响性能(例如:简介字段) ;
■使用varchar类 型代替char,因为varchar 会动态分配长度,char指定长度是固定的; 给表创建主键,对于没有主键的表,在查询和索引定义上有一定的影响;
■避免表字段运行为null,建议设置默认值(例如: int类型设置默认值为0) 在索引查询上,效率立显; 1建立索引,最好建立在唯-和非空的字段上,建立太多的索引对后期插入、更新都存在一定的影响(考虑实际情况来创建) ;
-end-
如果看到这里,说明你喜欢这篇文章,请转发、点赞加关注哦
转载自:https://juejin.cn/post/6869271520175194126