当前位置: 首页 > 科技观察

必须掌握的14道数据库面试题(附答案)

时间:2023-03-20 17:46:32 科技观察

一、为什么使用数据索引可以提高效率数据索引的存储是有序的在有序的情况下,通过索引查询一个数据不需要遍历索引记录在极端情况下,数据索引的查询效率就是二分法的查询效率,接近于log2(N)2。B+树索引和哈希索引的区别B+树是平衡的多叉树,从根节点到每个叶子节点的高度差不超过1,同级节点之间有指针,是有序的,如下图所示:哈希索引就是使用一定的哈希算法进行转换键值转换为新的哈希值。检索不需要像B+树那样从根节点到叶节点一步步查找。只需要一种hash算法,是无序的,如下图:3.hash索引的优点:等价查询,hahash索引有绝对的优势(前提:没有大量重复的key值,如果大量重复的key值,hash索引的效率很低,因为存在所谓的hash碰撞问题4.hash索引不适用的场景:不支持Range查询,不支持索引补全支持,不支持排序,不支持联合索引最左前缀匹配规则管理部分。从逻辑上看,只有一张表,但底层是由多个物理分区组成的。表分区和分表的区别?分表:是指把一个表分解成多个不同的表,比如用户订单记录按照时间分到多个表,分表和分区的区别是分区逻辑上只有一张表,而分表是将一张表分解成多张表7.表分区有什么好处?存储更多数据。分区表的数据可以分布在不同的物理设备上,从而有效地利用多个硬件设备。与单个磁盘或文件系统相比,可以存储更多的数据优化E查询。当where语句包含分区条件时,可以只扫描一张或多张分区表,提高查询效率;当涉及到sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。分区表更容易维护。例如:如果要批量删除大量数据,可以清空整个分区。避免一些特殊的瓶颈,比如InnoDB的单个索引的互斥访问,ext3询问你系统的inode锁竞争等。8.在MVCC并发控制中,读操作可以分为两类:快照读(snapshotread):读取记录的可见版本(可能是历史版本),不加锁(共享读锁s锁不加,所以不会阻塞其他事务的写入)当前读(currentread):读取的是最新版本的记录,当前读返回的记录会被锁定,保证其他事务不会并发修改这条记录,行级锁的优点:在多个线程访问不同的行时,只有少量的锁冲突。回滚时,只有少量的更改可以长时间锁定单行。10.行级锁的缺点:比页级或表级锁占用更多的内存。在表的大部分上使用时比页级或表级锁定慢,因为您必须获取更多锁。如果你经常对大部分数据执行GROUPBY操作或者必须经常扫描整个表,它比其他锁慢得多。使用高级锁定,您还可以通过支持不同类型的锁定轻松调整您的应用程序,因为锁定成本低于行级锁定。11.MySQL优化开启查询缓存,优化查询并解释你的select查询,可以帮助你分析你的查询语句或表结构的性能瓶颈。EXPLAIN的查询结果也会告诉你你的索引主键是怎么用的,你的数据表是怎么查找排序的。当你在只有一行数据的情况下使用limit1时,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续搜索下一条匹配该数据的记录,而是使用ENUM索引搜索字段VARCHARPreparedStatementsPreparedStatements就像存储过程,是后台运行的SQL语句的集合,使用preparedstatements我们可以得到很多好处,无论是性能问题还是安全问题。PreparedStatements可以检查你绑定的一些变量,可以保护你的程序免受“SQL注入”攻击垂直分表选择正确的存储引擎12.key和index的区别key是数据库的物理结构,它包含两层含义和作用,一层是约束(关注约束和规范数据库的结构完整性),二层是索引(用于辅助查询)。包括主键、唯一键、外键等。索引是数据库的物理结构。仅供辅助查询。当它被创建时,会以类目录结构存储在另一个表空间(mysql中的innodb表空间)中。如果要对索引进行分类,可以分为前缀索引、全文索引等;十三、Mysql中MyISAM和InnoDB有什么区别?InnoDB支持事务,MyISAM不支持InnoDB支持外键,但MylSAM不支持。将包含外键的InnoDB表转换为MYISAM将失败;InnoDB是聚簇索引,数据文件与索引绑定。必须有主键,主键索引效率高。InnoDB不保存表的具体行数,执行selectcount(*)fromtable时需要全表扫描。Innodb不支持全文索引,而MyISAM支持全文索引,MyISAM查询效率更高;十四、数据库建表注意事项1、字段名称和字段配置合理,剔除关联不紧密的字段;1.字段命名必须有规则和对应的含义(不要使用部分英文,部分拼音,以及a.b.c之类意义不明的字段);字段命名尽量不要使用缩写(大多数缩写不能明确字段的含义);字段不要大小写混写(要有可读性,多个英文单词可以用下划线连接);不要对字段名称使用保留字或关键字;保持字段名称和类型的一致性;仔细选择数字类型;为文本字段留出足够的边距;2、系统特殊字段处理完成后,建议添加删除标记(如操作员、删除时间);建立版本机制;3、表结构的合理性,配置多类型字段的处理,即表中是否有字段可以分解成更小的独立部分(例如:人可以分为男女);对于多值字段的处理,可以将表分成三张表,使得检索和排序更加规范,保证了数据的完整性!4.其他建议大数据字段,独立表存储,影响性能(例如:profile字段);使用varchar类型而不是char类型,因为varchar会动态分配长度,char的指定长度是固定的;为表创建主键,对于没有主键的表,在查询和索引定义上有一定的影响;为避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询中,效率立竿见影;在非空字段上,创建过多的索引会对后面的插入和更新产生一定的影响(根据实际情况创建);