1. 为什么使用数据索引能提高效率?
- 数据索引的存储是有序的;
- 在有序的情况下, 通过索引查询一个数据是无需遍历索引记录的;
- 极端情况下,数据索引的查询效率为二分法查询效率,趋近于log2(N)。
2. B+树索引和哈希索引的区别?
B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接,是有序的,如下图:
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可,是无序的,如下图所示:
3. 哈希索引的优势?
等值查询,哈希索引具有绝对优势(前提是:没有大量重复键值,如果大量重复键值时,哈希索引的效率很低,因为存在所谓的哈希碰撞问题)。
4. 哈希索引不适用的场景?
- 不支持范围查询;
- 不支持索引完成排序;
- 不支持联合索引的最左前缀匹配规则。
5. 什么是表分区?
表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。
6. 表分区与分表的区别?
分表:指的是通过一定规则, 将一张表分解成多张不同的表。比如将用户订单记录根据时间成多个表。
分表与分区的区别在于:分区从逻辑上来讲只有一张表 ,而分表则是将一张表分解成多张表。
7. 表分区有什么好处?
存储更多数据。分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。和单个磁盘或者文件系统相比,可以存储更多数据。
优化E询。在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。
分区表更容易维护。例如:想批量删除大量数据可以清除整个分区。
避免某些特殊的瓶颈。例如InnoDB的单个索引的互斥访问,系统的inode锁竞争等。
8. 在MVCC并发控制中,读操作可以分成哪两类?
快照读(snapshot read):读取的是记录的可见版本(有可能是历史版本),不用加锁(共享读锁s锁也不加,所以不会阻塞其他事务的写);
当前读(currentread):读取的是记录的最新版本,并且当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录。
9. 行级锁定的优点是什么?
- 当在许多线程中访问不同的行时只存在少量锁定冲突;
- 回滚时只有少量的更改;
- 可以长时间锁定单一的行。
10. 行级锁定的缺点是什么?
比页级或表级锁定占用更多的内存。当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表,比其它锁定明显慢很多。用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。
11. MySQL优化?
开启查询缓存,优化查询;
explain你的select查询,这可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN的查询结果还会告诉你,你的索引主键被如何利用的,你的数据表是如何被搜索和排序的;
当只要一行数据时使用limit 1, MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查下一条符合记录的数据;
为搜索字段建索引;
使用ENUM而不是VARCHAR;
Prepared StatementsPrepared Statements很像存储过程,是一种运行在后台的SQL语句集合,我们可以从使用prepared statements获得很多好处,无论是性能问题还是安全问题。Prepared Statements可以检查一些你绑定好的变量,这样可以保护你的程序不会受到“SQL注入式” 攻击;
垂直分表;
选择正确的存储引擎。
12. key和index的区别?
key是数据库的物理结构,它包含两层意义和作用,一是约束(偏 重于约束和规范数据库的结构完整性) ,二是索引(辅助查询 用的)。包括primary key、unique key、foreign key等;
index是数据库的物理结构,它只是辅助查询的,它创建时会在另外的表空间(mysql中的innodb表空间) 以一个类似目录的结构存储。索引要分类的话,分为前缀索引、全文本索引等。
13. Mysql 中MyISAM和InnoDB的区别有哪些?
InnoDB支持事务, MyISAM不支持;
InnoDB支持外键,而MylSAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
InnoDB是聚集索引,数据文件是和索引绑在一起,必须要有主键,通过主键索引效率高。
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描;
Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高。
14. 数据库表创建注意事项?
1>、字段名及字段配制合理性
剔除关系不密切的字段; 字段命名要有规则及相对应的含义(不要一部分英文,一部分拼音,还有类似a.b.c这样不明含义的字段) ;
字段命名尽量不要使用缩写(大多数缩写都不能明确字段含义) ;
字段不要大小写混用(想要具有可读性,多个英文单词可使用下划线形式连接) ;
字段名不要使用保留字或者关键字;
保持字段名和类型的一致性;
慎重选择数字类型; 给文本字段留足余量;
2>、系统特殊字段处理及建成后建议
- 添加删除标记(例如操作人、删除时间) ;
- 建立版本机制;
3>、表结构合理性配置
- 多型字段的处理 ,就是表中是否存在字段能够分解成更小独立的几部分(例如:人可以分为男人和女人) ;
- 多值字段的处理,可以将表分为三张表,这样使得检索和排序更加有调理,且保证数据的完整性!
4>、其它建议
对于大数据字段,独立表进行存储,以便影响性能(例如:简介字段) ;
使用varchar类型代替char,因为varchar 会动态分配长度,char指定长度是固定的; 给表创建主键,对于没有主键的表,在查询和索引定义上有一定的影响;
避免表字段运行为null,建议设置默认值(例如: int类型设置默认值为0) 在索引查询上,效率立显; 1建立索引,最好建立在唯一和非空的字段上,建立太多的索引对后期插入、更新都存在一定的影响(考虑实际情况来创建) 。
15. 存储过程?有哪些优缺点?
存储过程是一些预编译的SQL语句。
更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。
存储过程是一个预编译的代码块,执行效率比较高;
一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率;
可以一定程度上确保数据安全。
16. 索引是什么?有什么作用及优缺点?
索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构
你也可以这样理解:索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。
MySQL数据库几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引
索引加快数据库的检索速度;
索引降低了插入、删除、修改等维护任务的速度;
唯一索引可以确保每一行数据的唯一性;
通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
索引需要占物理和数据空间。
17. 什么是事务?
事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
18. 数据库的乐观锁和悲观锁是什么?
数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。
乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作;
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
19. 使用索引查询一定能提高查询的性能吗?为什么?
通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价。
索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:
基于一个范围的检索,一般查询返回结果集小于表中记录数的30%;
基于非唯一性索引的检索。
20. 简单说一说drop、delete与truncate的区别?
SQL中的drop、delete、truncate都表示删除,但是三者有一些差别
delete和truncate只删除表的数据不删除表的结构;
速度,一般来说: drop> truncate >delete;
delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;
如果有相应的trigger,执行的时候将被触发. truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger。
21. drop、delete与truncate 分别在什么场景之下使用?
- 不再需要一张表的时候,用drop;
- 想删除部分数据行时候,用delete,并且带上where子句;
- 保留表而删除所有数据的时候用truncate。
22. 超键、候选键、主键、外键分别是什么?
超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。
候选键:是最小超键,即没有冗余元素的超键。
主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
外键:在一个表中存在的另一个表的主键称此表的外键。
23. 什么是视图?以及视图的使用场景有哪些?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
只暴露部分字段给访问者,所以就建一个虚表,就是视图。
查询的数据来源于不同的表,而查询者希望以统一的方式查询,这样也可以建立一个视图,把多个表查询结果联合起来,查询者只需要直接从视图中获取数据,不必考虑数据来源于不同表所带来的差异。
24. 说一说什么是三范式?
第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:关键字段 → 非关键字段x → 非关键字段y。
25. 四种隔离级别是什么?
Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
Repeatable read (可重复读):可避免脏读、不可重复读的发生。
Read committed (读已提交):可避免脏读的发生。
Read uncommitted (读未提交):最低级别,任何情况都无法保证。
好了,本文就说到这里,欢迎小伙伴留言,说说你曾经遇到过的数据库面试题!