- 数据库的数据是实时更新的吗?每点击一次,数据库数据修改一次?
- Redis hash的个数
- 如何修改Redis数据库的库的个数?
- Redis数据库如何实现持久化
- Redis数据库支持的数据类型
- Redis使用AOF方式持久化,aof文件不断增大,如何处理?
- Redis数据库如何设置密码
- hash表是如何生成的
- MySQL数据库如何使用sql语句插入一条数据
- MySQL数据库的慢查询有了解过吗
- MySQL数据库如何进行查询优化
- 如何很多请求同时对Redis的同一个键进行访问,如何保证数据安全
- 说说Redis的淘汰机制
- 我的MySQL数据库每天晚上12点进行全备份。第二天有员工在9点钟误删除了一个数据库,但在10点钟才被发现。问如何进行恢复被误删除的数据库并同时保留9点到10点钟新增的数据同时不影响业务的正常运行?
- 当数据越来越多,如何避免hash槽中key出现相同的情况?
- MongoDB在哪些场合使用过?
3.1 什么是存储过程?有哪些优缺点?
存储过程是一些预编译的SQL语句
更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或者多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候直接调用就可以了
- 存储过程是一个预编译的代码块,执行效率比较高
- 一个存储过程替代大量T-SQL语句,可以降低网络通信量,提高通信速率
- 可以一定程序上确保数据安全
如果你对存储过程不熟悉,建议阅读 存储过程详解-博客园
3.2 索引是什么? 有什么作用以及优缺点?
索引是对数据库表表中一个或者多个列的值进行排序的结构,是帮助MYSQL高效获取数据的数据结构
你也可以这样理解:索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引(目录)。在书籍中,索引允许用户不必翻阅完整书就能迅速找到需要的信息。在数据库,索引也允许数据库程序迅速的找到表中的数据,而不必扫描整个数据库。
MYSQL数据库的几个基本的索引类型:
- 普通索引
- 唯一索引
- 主键索引
- 全文索引
索引的优缺点
- 索引加快了数据库的检索速度
- 索引降低了插入、删除、修改等维护任务的速度
- 唯一索引可以确保每一行数据的唯一性
- 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
- 索引需要战胜物理和数据空间
索引更多信息:漫谈数据库索引
常见的数据库系统的索引的数据结构, 多是
数据结构 | 数据库 |
---|---|
B-Tree | oracle/sysbase |
B+Tree | MySQL |
B-Tree 不同于 Binary Tree (二叉树,最多有两个子树),一般M阶的B-Tree
满足以下条件:
- 每个结点至多有M个孩子
- 除root和叶子结点外,其它每个结点至少有M/2个孩子
- root 至少有两个孩子(除非该树仅包含一个结点)
- 所有叶结点在同一层,叶结点不包含任何关键字信息;
- 有K个关键字的非叶结点恰好包含K+1个孩子
另外,对于一个结点,其内部的关键字是从小到大排序的,以下是B-Tree(M=4)的样例
3.3 什么是事务?
什么是事务
事务Transaction
是并发控制的基本单位。
相较于系统内部的多进程/线程并发控制,需要考虑的内存数据同步问题;事务是数据操作请求并发需要考虑的数据同步问题。
所谓的事务,
- 它是一个操作序列,这些操作要么是都执行,要么都不执行,
- 它是一个不可分割的工作单位。
- 是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性
事务更多信息: 数据库事务 - Mr.David
事务的特性
事务具有以下 4 个基本特征ACID:
- Atomic 原子性: 事务中的所有元素作为一个整体提交或回滚,事务的个元素是不可分的,事务是一个完整操作。要么全部成功,要么全部失败
- Consistency 一致性:事物完成时,数据必须是一致的,也就是说,和事物开始之前,数据存储中的数据处于一致状态。保证数据的无损。
- Isolation 隔离性:多个事务是彼此隔离的。这表明事务必须是独立的,不应该以任何方式以来于或影响其他事务。
durability 持久性:事务结束后,事务处理的结果必须能够得到固化。
事务语句
开始事务: begin transaction
- 提交事务:commit transaction
- 回滚事务:rollback transaction
事务的隔离
从理论上来说,事务应该彼此完全隔离,以避免并发事务所带来的问题,然而,那样会对性能产生极大的影响,因为事务必须按顺序运行,
在实际开发中,为了提升性能,事务会以较低的隔离级别运行,事务的隔离级别可以通过隔离事务属性指定
事务的并发问题
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致。
3、幻读:幻读解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。例如:事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作 这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。 而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有跟没有修改一样,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
事务的隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 read-uncommitted | 是 | 是 | 是 |
不可重复读 read-committed | 否 | 是 | 是 |
可重复读 repeatable-read (mysql) | 否 | 否 | 是 |
串行化 serializable | 否 | 否 | 否 |
- 读未提交:另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据脏读
- 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致。
- 可重复读:在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象
- 串行化:最高的隔离级别,在这个隔离级别下,不会产生任何异常。并发的事务,就像事务是在一个个按照顺序执行一样
MySQL默认的事务隔离级别为 repeatable-read
- MySQL 支持 4 中事务隔离级别.
- 事务的隔离级别要得到底层数据库引擎的支持, 而不是应用程序或者框架的支持.
- Oracle 支持的 2 种事务隔离级别:READ_COMMITED , SERIALIZABLE
补充:
- SQL规范所规定的标准,不同的数据库具体的实现可能会有些差异
- MySQL中默认事务隔离级别是“可重复读”时并不会锁住读取到的行
- 事务隔离级别:未提交读时,写数据只会锁住相应的行。
- 事务隔离级别为:可重复读时,写数据会锁住整张表。
-
3.4 数据库的乐观锁和悲观锁是什么?
数据库管理系统DBMS中的并发控制的任务:是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。
乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要彩的技术手段。 悲观锁:假定会发生并发冲突,屏蔽一切可能违反灵气完整性的操作
- 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
两种锁的更多信息:深入理解乐观锁和悲观锁
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大,鱼和熊掌不可兼得啊。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
3.5 使用索引查询一定能提高查询的性能吗?为什么
通常,通过索引查询数据比全表扫描要快,但是我们也必须注意到它的代价。
索引需要空间来侦破,也需要定期维护,每当有记录在表中增减或者索引列被修改时,索引本身也会被修改。这意味着每条记录的insert/delete/update
将为此多付出4,5次的磁盘IO
。因为索引需要额外的存储空间和处理,那些不必要的索引反而会使用查询反应的时间变慢。使用索引查询不一定能提高查询性能,直综范围查询(index range scan)适用于两种情况:
- 基于一个范围的检查,一般查询返回结果集>表中记录的30%
-
3.6 简单说一说 drop/delete与truncate的区别
SQL中的
drop、delete、truncate
都表示删除,但是三者有一些差别 delete 和 truncate 只删除表的数据不删除表的结构
- delete是dml 数据操纵语句,这个操作会放到
rollback segement
中,事务提交之后才生效;如果有相应的tigger
,执行的时候将被触发。 - truncate、drop 是ddl 数据定义语句,操作立即生效,原数据不放到
rollback segement
中,不能回滚,操作不触发tigger
三者更多的信息,建议阅读: drop、truncate和delete的区别
3.7 drop/delete与truncate分别在什么场景之下使用
- 删除一张表(表结构+数据)的时候,用
drop
- 删除一张表(表结构)的时候,用
truncate
-
3.8 超键、候选键、主键、外键分别是什么?
超键: 在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。
超键=候选键+主键
- 候选键:是最小超键,即没有冗余元素的超键
- 主键:表中能唯一且完整标识储存数据对象的列或者属性的组合(数据库表中对储存数据对象予以唯一和完整标识的数据列或者属性的组合),一个数据列只能有一个主键,且主键的聚会不能缺失,即不能为空值(null)
-
3.9 什么是视图?以及视图的使用场景有哪些?
视图:是一个虚拟的表,具有和物理表相同的功能。
可以对视图进行增、改、查操作,视图通常是由一个表或者多个表的行或者列的子集。对视图的修改不影响基本表。它使我们比多表查询更容易取得数据。 只暴露部分字段给访问者,所以就那一个虚表,就是视图
查询的数据来源于不同的表,而查询者希望以统一的方式查询,这样也可以建立一个视图,氢多个表查询结果联合起来,查询者只需要直接从视图中获取数据,不必数据来源于不同表
3.10 说一说三个范式
第一范式
1NF
: 数据库表中的字段都是单一属性的,不可再分割。- 第二范式
2NF
:数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖,也即所有非关键字段都完全依赖于任意一组候选关键字 - 第三范式
3NF
:在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。部分函数依赖指:是存在组合关键字中的某些字段决定非关键字段的情况 传递函数依赖:指的是如果存在”A → B → C”的决定关系,则C传递函数依赖于A。因此,
三个范式更多的信息:解释一下关系数据库的第一第二第三范式?
3.11 join
3.12 sql与nosql对比
3.13 elasticsearch
elasticsearch 是一个分布式、可扩展、实时的搜索与数据分析引擎