跳至主要內容

数据库面试习题(上)

CodeShouhu大约 28 分钟使用指南Markdown

关系型与非关系型数据库

1,关系型和非关系型数据库的区别你了解多少?

关系型数据库非关系型数据库数据存储方式扩展方式 和对 事务性支持 等方面存在明显的区别。

  1. 数据存储方式关系型数据库数据 是以 表格 的形式进行存储的,表格 组成,数据结构化 的方式进行存储。而 非关系型数据库数据存储方式 则更加 灵活,可以是以 文档键值对列存储 或者 图结构 的形式进行存储,这种 存储方式 适用于各种不同类型的 应用场景
  2. 扩展方式关系型数据库 在基于 web结构 中难以进行 横向扩展,即当 应用系统用户量访问量 增加时,无法简单地通过添加更多的 硬件服务节点 来提高 性能负载能力。相比之下,非关系型数据库横向扩展 的,可以通过添加更多的 数据库服务器节点)来分担 负载,这使得 非关系型数据库 在处理 大量数据 时具有更高的 性能扩展性
  3. 对事务性的支持:如果 数据操作 需要高 事务性 或者 复杂数据查询 需要控制 执行计划,那么传统的 关系型数据库性能稳定性 方面考虑是更好的选择。这是因为 关系型数据库 提供了强大的 事务处理功能,可以保证 数据一致性完整性。而 非关系型数据库 则可能无法提供相同级别的 事务处理功能
  4. 读写性能关系型数据库读写性能 相对较差,尤其是在处理 海量数据 时,效率 较低。而 非关系型数据库 则具有较高的 读写性能,可以更快地处理 大量数据
  5. 结构的灵活性关系型数据库结构 通常是 固定 的,灵活性 较低。而 非关系型数据库结构 则更加 灵活,可以根据需要进行 调整改变

综上所述,关系型数据库非关系型数据库 各有其 优点缺点,选择哪种类型的 数据库 取决于具体的 应用场景需求

速记

关系非关有区别,存储扩展事务别。
关系表格结构严,非关灵活形式全。
横向扩展关系难,非关加节点分担。
事务处理关系强,非关可能不跟上。
海量数据读写慢,非关高效速度赞。
关系结构较固定,非关调整更自主。
场景需求来定夺,合理选择好处多。

2,什么是非关系型数据库?

非关系型数据库NoSQLNot Only SQL)是一种 数据库设计模式,它主要是 非关系型 的、分布式 的,并且不保证遵循 ACID 原则NoSQL 最常见的解释是 “non-relational”,也被很多人接受为 “Not Only SQL”。这种 数据库设计模式 对传统的 关系型数据库管理系统RDBMS)提出了挑战。

非关系型数据库 可以分为以下几种主要类型:

  1. 键值对存储Key-Value):数据键值对 的形式存储,查找速度 快,但 数据结构化,通常只被当作 字符串 或者 二进制数据。常见的 软件Redis,主要用于处理 大量数据高访问负载,也用于一些 日志系统 等等。
  2. 列存储Column-Oriented):面向 检索列式存储,其 存储结构列式结构。这种 结构 会让很多 统计聚合操作 更简单方便,使 系统 具有较高的 可扩展性。这类 数据库 还可以适应 海量数据 的增加以及 数据结构 的变化,比如 Google App EngineBigTable 以及相同 设计理念Hadoop 子系统 HBase 就是这类的典型代表。
  3. 文档数据库存储Document-Oriented):数据结构 要求不严格,表结构 可变,不需要像 关系型数据库 一样需要预先定义 表结构。常见的 软件MongoDB,主要用于 Web 应用。其 数据模型Key-Value 对应的 键值对Value结构化数据
  4. 图形数据库存储Graph-Oriented):利用 图结构 相关 算法,比如 最短路径寻址N 度关系查找 等。常见的 软件InfoGrid,主要用于 社交网络推荐系统 等。其 数据模型图结构

每种类型的 非关系型数据库 都有其自身的 优点缺点,选择哪种类型的 数据库 取决于具体的 应用场景需求

速记

NoSQL 模式妙,非关分布不 ACID 。
解释常见俩说法,挑战传统 RDBMS 了。
类型多样要记牢,键值列存很明了。
键值对快结构糙,Redis 高负日志搞。
列存检索聚合巧,扩展海量适应好。
BigTable 与 HBase,代表软件真不少。
文档存储结构飘,MongoDB 网页俏。
图形数据库奇妙,社交推荐 InfoGrid 跑。
NoSQL 世界真热闹,按需选择错不了。

3,表跟表是怎么关联的?

之间常用的 关联方式 有两种:内连接外连接,下面以 MySQL 为例来说明这两种 连接方式

内连接内连接 通过 INNER JOIN 来实现,它将返回两张 中满足 连接条件数据,不满足 条件数据 不会查询出来。

外连接外连接 通过 OUTER JOIN 来实现,它会返回两张 中满足 连接条件数据,同时返回不满足 连接条件数据外连接 有两种形式:左外连接LEFT OUTER JOIN)、右外连接RIGHT OUTER JOIN)。

左外连接:可以简称为 左连接LEFT JOIN),它会返回 左表 中的所有 记录右表 中满足 连接条件记录

右外连接:可以简称为 右连接RIGHT JOIN),它会返回 右表 中的所有 记录左表 中满足 连接条件记录

全外连接连接 中不匹配的 数据 全部会显示出来

交叉连接笛卡尔效应,显示的结果是 连接表数乘积

一对多关联:这种 关联形式 最为常见,一般是两张 具有 主从关系,并且以 主表主键 关联 从表外键 来实现这种 关联关系。另外,以 从表 的角度来看,它们是具有 多对一关系 的,所以不再赘述 多对一关联 了。

多对多关联:这种 关联关系 比较复杂,如果两张 具有 多对多的关系,那么它们之间需要有一张 中间表 来作为 衔接,以实现这种 关联关系。这个 中间表 要设计两列,分别存储那两张 主键。因此,这两张 中的任何一方,都与 中间表 形成了 一对多关系,从而在这个 中间表 上建立起了 多对多关系

自关联自关联 就是一张 自己与自己 相关联,为了避免 表名冲突,需要在 关联 时通过 别名 将它们当做两张 来看待。一般在 数据 具有 层级树状)时,可以采用 自关联 一次性查询出 多层级的数据

速记

数据库里连接全,多种类型记心间。
内连 INNER 条件限,满足条件才相见。
外连 OUTER 更全面,不满足的也露面。
左连左表全呈现,右连右表无遮掩。
全外连接不匹配,数据统统都出现。
交叉连接笛卡尔,结果乘积真明显。
一对多是主从线,主键外键来关联。
多对多要中间表,两列主键做桥链。
自关联表自己连,别名区分层级显。
连接关联掌握全,数据库里不犯难。

4,表跟表是怎么关联的?

在SQL中,将行转换为列通常需要使用PIVOT操作。不同的数据库系统可能有不同的语法和实现方式,以下是在常见数据库系统中进行PIVOT操作的示例:

  1. 在MySQL中,可以使用条件聚合和CASE语句来实现PIVOT操作。例如,假设有一个名为data的表,包含idcategoryvalue三个列,我们想要将category的不同值作为列,value作为对应的值:
SELECT id,
       MAX(CASE WHEN category = 'category1' THEN value END) AS category1,
       MAX(CASE WHEN category = 'category2' THEN value END) AS category2,
       MAX(CASE WHEN category = 'category3' THEN value END) AS category3
FROM data
GROUP BY id;
  1. 在Oracle数据库中,可以使用DECODE函数和聚合函数来实现PIVOT操作。假设有相同的表结构和需求:
SELECT id,
       MAX(DECODE(category, 'category1', value)) AS category1,
       MAX(DECODE(category, 'category2', value)) AS category2,
       MAX(DECODE(category, 'category3', value)) AS category3
FROM data
GROUP BY id;
  1. 在SQL Server中,可以使用PIVOT关键字来实现行转列的操作。假设有相同的表结构和需求:
SELECT id, category1, category2, category3
FROM (
  SELECT id, category, value
  FROM data
) AS source
PIVOT (
  MAX(value)
  FOR category IN (category1, category2, category3)
) AS pivot_table;

这些示例展示了在不同数据库系统中如何将行转换为列的基本方法。具体的实现方式可能因数据库系统和需求而异,但基本思路是使用条件聚合或PIVOT关键字来将不同类别的值转换为列。请注意,在实际应用中,可能需要根据具体的表结构和需求进行调整。

5,谈谈你对SQL注入的理解

SQL注入 是一种常见的 网络攻击技术,通过在 Web 应用程序 中的 输入字段 中插入 恶意 SQL 语句攻击者 可以操纵 数据库 以执行 未授权的操作

SQL注入攻击 的发生是因为 Web 应用程序 没有正确 验证用户输入,或者没有正确地 处理用户输入。当用户在 输入字段 中输入数据时,应用程序 应该 验证输入的合法性,例如检查输入是否符合预期的 格式长度类型。如果 应用程序 没有执行这些检查,或者没有正确地 处理输入攻击者 可以在 输入字段 中插入 恶意的 SQL 语句

一旦 攻击者 成功地将 恶意 SQL 语句 插入到 应用程序 中,他们可以执行各种操作,例如 读取修改删除 数据库 中的 数据。他们甚至可以通过执行 SQL 语句 来完全控制 数据库

为了防止 SQL注入攻击开发人员 可以采取多种措施。首先,他们应该 验证所有用户输入的合法性,确保输入符合预期的 格式长度类型。其次,他们应该使用 参数化查询预编译语句 来执行 SQL 查询,而不是将 用户输入 直接插入到 SQL 语句 中。这些技术可以确保 用户输入 被视为 数据 而不是 代码,从而防止 SQL注入攻击 的发生。

总之,SQL注入 是一种常见的 网络攻击技术,可以通过在 Web 应用程序 中的 输入字段 中插入 恶意 SQL 语句 来操纵 数据库。为了防止这种攻击,开发人员 应该 验证所有用户输入的合法性,并使用 参数化查询预编译语句 来执行 SQL 查询

速记

SQL 注入很常见,恶意语句搞破坏。
输入字段藏危险,未授权操作全来干。
攻击起因有两点,验证处理没做全。
输入检查不严格,恶意语句能插入。
一旦注入成功后,数据读写删不愁。
甚至控制数据库,危害极大要关注。
开发防范有高招,输入验证不能少。
参数查询预编译,注入攻击全赶跑。
牢记这些小妙招,数据库安全没烦恼。

6,简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别

MySQL 数据库 中,MyISAMInnoDB 是两种常用的 存储引擎。它们有一些 相同点 和很多 不同点,下面分别进行简述:

相同点

  1. 都支持索引MyISAMInnoDB 都支持 B-tree 索引,这使得 数据检索 更加高效。但是两者的 实现方式 不太一样。InnoDB 引擎 中,其 数据文件 本身就是 索引文件。相比 MyISAM索引文件数据文件 是分离的,其 表数据文件 本身就是按 B+Tree 组织的一个 索引结构,树的 叶节点 data 域 保存了完整的 数据记录
  2. 都支持全文搜索MyISAMInnoDB 都支持 全文搜索,但 MyISAM全文搜索功能 更强大。

不同点

  1. 事务和外键支持InnoDB 支持 事务外键,而 MyISAM 不支持。事务 是一组一起执行的 SQL 语句,它们要么全部成功执行,要么全部失败 回滚外键 是一个 中的 ,它引用另一个 中的 主键
  2. 锁定级别MyISAM 只支持 表级锁定,而 InnoDB 支持 行级锁定表级锁行级锁定 允许 并发访问 表中的不同 ,从而提高 并发性性能
  3. 存储空间MyISAM 可以被 压缩存储空间 较小,而 InnoDB 需要更多的 内存存储InnoDB 会在 主内存 中建立其专用的 缓冲池 用于高速缓冲 数据索引
  4. 可移植性、备份及恢复:由于 MyISAM数据 是以 文件 的形式存储,所以在 跨平台的数据转移 中会很方便。在 备份恢复 时可单独针对某个 进行操作。
  5. 文件格式MyISAM数据索引 是分别存储的,数据.MYD),索引.MYI)。而 InnoDB数据索引 是集中存储的(.ibd)。
  6. 记录存储顺序MyISAM记录插入顺序 保存,而 InnoDB主键大小 有序插入。
  7. 崩溃修复能力MyISAMInnoDB 都支持 崩溃修复能力,但 InnoDB崩溃修复能力 更强大。
  8. 全文搜索能力:虽然 MyISAMInnoDB 都支持 全文搜索,但 MyISAM全文搜索功能 更强大。
  9. 多版本并发控制InnoDB 支持 多版本并发控制MVCC),而 MyISAM 不支持。这使得 InnoDB高并发场景性能 更好。

综上所述,MyISAMInnoDBMySQL 数据库 中都有各自的 优点缺点。选择哪种 存储引擎 取决于具体的 应用场景需求。如果需要 事务外键支持行级锁定、更好的 崩溃修复能力全文搜索能力,可以选择 InnoDB;如果需要更小的 存储空间、方便的 跨平台数据转移备份恢复,可以选择 MyISAM

速记

MySQL 引擎俩常用,MyISAM 和 InnoDB。
相同之处有两点,索引搜索都沾边。
B - tree 索引效率显,全文搜索各争先,MyISAM 更占先。
不同之处真不少,听我慢慢来说好。
事务外键 InnoDB 搞,MyISAM 只能瞧。
锁定级别有高招,MyISAM 表级跑,InnoDB 行级性能妙。
存储方面有分晓,MyISAM 压缩省空间,InnoDB 缓冲占资源。
移植备份 MyISAM 便,文件形式好迁移。
文件格式不一样,MyISAM 分存各归仓,InnoDB 集中共一堂。
记录顺序有差别,MyISAM 插入排,InnoDB 主键来安排。
崩溃修复有高低,InnoDB 能力更无敌。
全文搜索 MyISAM 强,高并发 MVCC InnoDB 棒。

7,InnoDB 对 MVCC 的实现

8,完整性约束包括哪些?

完整性约束(constraint)机制关系型数据库 中的一种 重要机制,用于保证 数据库数据的完整性完整性约束 可以分为以下几种:

  1. 实体完整性(Entity Integrity):保证 中有一个 主键。在 InnoDB 存储引擎表 中,可以通过定义 Primary Key 或者 Unique Key 约束 来保证 实体的完整性。也可以通过编写 触发器 来保证 数据完整性
  2. 域完整性(Domain Integrity):保证 数据的值 满足特定的 条件。在 InnoDB 存储引擎表 中,域完整性 可以通过以下几种途径来保证:选择合适的 数据类型 可以确保一个 数据值 满足特定 条件外键(Foreign Key)约束,编写 触发器,还可以考虑用 DEFAULT 约束 作为强制 域完整性 的一个方面。
  3. 参照完整性(Referential Integrity):保证 两张表之间的关系InnoDB 存储引擎 支持 外键,因此允许用户定义 外键 以强制 参照完整性,也可以通过编写 触发器 以强制执行。
  4. 用户定义的完整性:不同的 关系数据库系统 根据其 应用环境 的不同,往往还需要一些 特殊的约束条件用户定义的完整性 即是针对某个特定 关系数据库约束条件,它反映某一具体 应用 必须满足的 语义要求。与 有关的 约束:包括 列约束(NOT NULL(非空约束))和 表约束(PRIMARY KEY、foreign keycheckUNIQUE) 。

总的来说,完整性约束数据库设计 中非常重要的一部分,可以帮助确保 数据准确性一致性可靠性

速记

关系数据很重要,完整约束不可少。
保证数据准又靠,分类别听我唠。
实体完整有主键,主键唯一来呈现。
主唯约束可实现,触发器也能参战。
域完整性条件严,数据类型先把关。
外键默认触发器,确保数值合规范。
参照完整表关联,外键约束来牵线。
或者触发写一遍,表间关系稳如岩。
用户定义更灵活,特殊条件自己设。
列与表级约束多,非空唯一都要捉。
完整约束意义妙,准确一致没烦恼。
设计之时要记牢,数据可靠乐逍遥。

9,什么叫视图?游标是什么?

视图 是一种 虚拟的表,具有和 物理表 相同的 功能。可以对 视图 进行 操作,视图 通常是有一个 或者多个 子集。对 视图修改 不影响 基本表。它使得我们获取 数据 更容易,相比 多表查询。(1) 视图 能够 简化用户的操作 (2) 视图 使用户能以 多种角度 看待同一 数据;(3) 视图数据库 提供了一定程度的 逻辑独立性; (4) 视图 能够对 机密数据 提供 安全保护

游标 是对 查询出来的结果集 作为一个 单元有效处理游标 可以定在该 单元 中的特定 ,从 结果集当前行 检索一行或多行。可以对 结果集 当前行修改。一般不使用 游标,但是需要 逐条处理数据 的时候,游标 显得十分重要。

速记

视图虚拟像实表,增改查它真可靠。
一行一列或多表,修改对基没干扰。
简化操作没烦恼,多角看数真奇妙。
逻辑独立有依靠,机密数据保护好。
再来说说游标妙,结果集合当胞包。
定在特定行坐标,检索修改有高招。
逐条处理不能少,游标此时很重要。

10,MySQL三大日志(binlog、redo log和undo log)详解

MySQL 中的三大 日志 分别是 binlog(归档日志)、redo log(重做日志)和 undo log(回滚日志)。下面分别详细介绍这三大 日志作用特点

  1. binlog(归档日志)

binlogMySQL逻辑日志,以 二进制 的形式记录 数据库 执行的 写入性操作(不包括 查询)信息。binlog 的主要 使用场景 有两个,分别是 主从复制数据恢复。在 主从复制 中,Master 端 开启 binlog 并将其发送到各个 Slave 端Slave 端 重放 binlog 从而达到 主从数据一致。在 数据恢复 中,可以使用 mysqlbinlog 工具恢复数据binlog 有三种 格式,分别是 STATMENTROWMIXED,具体选择哪种 格式 取决于具体的 应用场景

  1. redo log(重做日志)

redo logInnoDB 存储引擎 独有的,它让 MySQL 拥有了 崩溃恢复能力。在 MySQL 实例 崩溃或 宕机 后,重启InnoDB 存储引擎 会使用 redo log 恢复数据,保证 数据持久性完整性redo log 记录的是 物理日志,记录的是 数据页变更redo log 采用 追加 的方式进行 写入,可以通过 max_binlog_size 参数 设置每个 redo log 文件大小redo log 它是 物理日志,记录内容是“在某个 数据页 上做了什么 修改”,属于 InnoDB 存储引擎。而 binlog逻辑日志,记录内容是 语句原始逻辑

  1. undo log(回滚日志)

undo log 也是 InnoDB 存储引擎 独有的,用于实现 事务原子性。在 事务执行过程 中,undo log 记录了对 数据修改前的信息,如果 事务回滚,可以使用 undo log回滚数据。同时,undo log 也用于实现 MVCC多版本并发控制),通过保存 旧版本的数据,使得 并发事务 可以读取到 一致的数据

总结

binlogredo logundo logMySQL 中非常重要的 日志系统,各自承担着不同的 角色binlog 用于记录 写入性操作信息,用于 主从复制数据恢复redo log 用于保证 数据持久性崩溃恢复能力undo log 用于实现 事务原子性MVCC。这些 日志系统协同工作,保证了 MySQL 数据库高可用性高性能

速记

MySQL 日志有三宝,bin、redo、undo 不能少。
先说 binlog 归档妙,逻辑日志二进制搞。
写入操作全记牢,查询它可不管了。
主从复制离不了,Master 发它 Slave 跑。
数据恢复也可靠,mysqlbinlog 来帮忙找。
三种格式要知道,STATMENT、ROW、MIXED 按需挑。
再谈 redo 重做好,InnoDB 引擎它独抱。
崩溃恢复有高招,数据持久又完整保。
物理日志数据改,追加写入速度好。
大小参数可设置,max_binlog_size 别忘掉。
最后 undo 回滚巧,事务原子它打造。
修改之前信息找,回滚数据没烦恼。
MVCC 它也搞,并发数据一致瞧。
三大日志协同好,高可用与性能高。

11,SQL语句在MySQL中的执行过程

MySQL 中,SQL 语句执行过程 可以分为以下几个步骤:

  1. 连接阶段客户端 发送 请求,与 MySQL 服务器 建立 连接。在这个阶段,服务器 会对 客户端连接请求 进行 身份验证验证 包括 用户名密码来源 IP 地址 等信息。
  2. 解析阶段MySQL 服务器 接收到 SQL 语句 后,会首先对 语句 进行 解析解析过程 包括 语法分析语义分析语法分析 主要是检查 SQL 语句语法 是否正确,而 语义分析 则是检查 SQL 语句 中的 等是否存在,以及是否有 权限 执行该 语句
  3. 优化阶段:在 解析阶段 完成后,MySQL 服务器 会对 SQL 语句 进行 优化优化器 会根据 统计信息索引信息 等,选择 最优的执行计划优化器 的选择会对 查询性能 产生重要的影响。
  4. 执行阶段:在 优化阶段 完成后,MySQL 服务器 会按照 优化器 选择的 执行计划,执行 SQL 语句执行过程 包括从 磁盘内存 中读取 数据、进行 计算返回结果 等。
  5. 返回结果执行完成 后,MySQL 服务器 会将 结果 返回给 客户端。如果 查询结果 较大,服务器分批次返回结果,直到所有 结果 都返回完毕。

在以上过程中,MySQL 服务器 会使用多种 内部机制 来提高 性能,例如 缓存查询结果使用索引加速查询并发执行 等。同时,开发人员 也可以通过编写 高效的 SQL 语句 和使用 合适的索引 等方式,来提高 查询性能

速记

MySQL 里 SQL 跑,执行步骤要知晓。
连接阶段先报到,客户请求服务器找。
身份验证不能少,用户密码 IP 瞧。
解析阶段跟着到,语法语义细扫描。
语法正确才有效,表列权限要查好。
优化阶段很重要,统计索引来参考。
最优计划它挑好,查询性能大提高。
执行阶段动真刀,数据读写计算搞。
结果返回别乱跑,分批传送慢慢交。
内部机制有高招,缓存索引并发妙。
高效语句索引找,性能提升呱呱叫。

12 MySQL主从同步是如何实现的?

参考答案

MySQL 主从同步 是指将 主数据库(Master) 上的 数据 复制到 从数据库(Slave) 上,并保持 主从数据库 之间 数据一致 的过程。MySQL 主从同步 的实现基于 binlog(二进制日志)I/O 线程 以及 SQL 线程。具体实现步骤如下:

  1. 主数据库 开启 binlog 功能,并设置 binlog 格式binlog 文件名 等参数。
  2. 从数据库 开启 主从同步功能,并设置 主数据库连接信息同步参数 等。
  3. 主数据库 上执行的 写入性操作(包括 INSERTUPDATEDELETE 等)会被记录到 binlog 中。
  4. 从数据库 启动 I/O 线程,连接到 主数据库 并读取 binlog 中的 操作日志
  5. I/O 线程 将读取到的 binlog 日志 写入到本地的 relay log(中继日志) 中。
  6. 从数据库 启动 SQL 线程,读取 relay log 中的 操作日志,并将其 重放从数据库 中。
  7. SQL 线程重放操作日志 写入到 从数据库binlog 中,以保证 从数据库 也可以作为 主数据库 进行 主从同步

MySQL 主从同步 的实现基于 复制协议,可以通过 一主多从级联复制环形复制 等方式实现多个 从数据库主数据库 之间的 数据同步主从同步 可以实现 读写分离负载均衡数据备份 等功能,提高 系统可用性性能

速记

主从同步要记牢,Master 数据 Slave 拷。
数据一致很重要,实现依赖 binlog。
主库先把日志搞,格式参数设置好。
从库开启同步妙,连接信息别忘掉。
主库写入操作到,binlog 里面全记到。
从库 I/O 线程跑,读取日志不迟到。
Relay log 本地保,SQL 线程来重跑。
重放操作也记牢,主从角色可颠倒。
复制协议真可靠,多种方式来同步。
读写分离性能高,负载均衡没烦恼。
数据备份有保障,系统可用呱呱叫。

13、数据库高并发是我们经常会遇到的,你有什么好的解决方案吗?

数据库高并发 是我们在实际应用中经常会遇到的问题。下面是一些常见的 解决方案

  1. 数据库优化:通过优化 数据库配置索引查询语句 等,提高 数据库性能并发处理能力。例如,可以增加 数据库缓存、减少 磁盘 I/O 操作、优化 查询语句 等。
  2. 读写分离:将 读操作写操作 分离到不同的 数据库实例 上,减轻单个 数据库实例 的压力,提高 并发处理能力。可以通过 主从复制分片集群 等方式实现 读写分离
  3. 分布式数据库:使用 分布式数据库系统,将 数据 分散到不同的 数据库节点 上,提高 数据库扩展性并发处理能力。例如,可以使用 MySQL ClusterCockroachDB分布式数据库系统
  4. 缓存技术:使用 缓存技术,将经常访问的 数据 存储在 内存 中,减少 数据库访问次数,提高 并发处理能力。例如,可以使用 RedisMemcached缓存系统
  5. 分页查询:对于大量 数据查询,可以使用 分页查询技术,将 查询结果 分成较小的块进行返回,减少单次 查询 返回的 数据量,提高 并发处理能力
  6. 数据库连接池:使用 数据库连接池技术,管理和复用 数据库连接,避免频繁创建和关闭 数据库连接 带来的 性能开销,提高 并发处理能力
  7. 水平扩展:通过增加 数据库服务器 的数量,实现 数据库水平扩展,提高 并发处理能力。可以使用 负载均衡技术,将 请求 分发到不同的 数据库服务器 上进行处理。

综上所述,针对 数据库高并发 问题,我们可以采用多种 解决方案,具体的 方案 需要根据实际情况进行评估和选择。

速记

高并发事常遇见,多种方案来救援。
数据库优首当先,配置索引查语句。
缓存加来 I/O 减,性能提升笑开颜。
读写分离压力减,主从分片把活干。
分布系统真能干,节点扩展不犯难。
缓存技术内存占,Redis、Memcached 来报到。
分页查询数据小,并发处理呱呱叫。
连接池里管理妙,连接复用开销少。
水平扩展服务器,负载均衡来调度。
方案多样要评估,实际情况细选出。

14 介绍一下数据库分页

数据库分页是一种常用的技术,用于将大量的数据分成较小的、更易于管理的部分,以便在网页或其他应用程序中显示。MySQL是一种流行的关系型数据库管理系统,它支持多种分页技术。

在MySQL中,可以使用LIMIT子句来实现分页。LIMIT子句接受两个参数:偏移量(Offset)和行数(Row Count)。偏移量指定了从哪一行开始返回数据,行数指定了返回多少行数据。

下面是一个使用LIMIT子句进行分页的示例查询:

SELECT * FROM table_name LIMIT 10 OFFSET 20;

这个查询将从表table_name中返回从第21行开始的10行数据(偏移量从0开始计数)。

在实际应用中,通常会使用变量来动态计算偏移量和行数,以便根据用户的请求来显示不同的页面。例如,假设每页显示10条记录,用户请求第3页,那么可以用以下查询来获取相应的数据:

SELECT * FROM table_name LIMIT 10 OFFSET (3-1) * 10;

这个查询将返回从第21行到第30行的数据,即第3页的内容。

除了使用LIMIT子句外,MySQL还提供了一些其他分页技术,例如使用游标(Cursor)和子查询等。然而,LIMIT子句是最常用和最简单的方法之一。

15 介绍一下SQL中的聚合函数

参考答案

常用聚合函数COUNT()AVG()SUM()MAX()MIN(),下面以 MySQL 为例,说明这些 函数作用

COUNT() 函数

COUNT() 函数 统计 数据表 中包含的 记录行总数,或者根据 查询结果 返回 中包含的 数据行数,它有两种 用法

COUNT(*) 计算 中总的 行数,不管某 是否有 数值 或者为 空值

COUNT(字段名) 计算指定 下总的 行数,计算时将忽略 空值

COUNT() 函数 可以与 GROUP BY 一起使用来计算每个 分组总和

AVG() 函数

AVG() 函数 通过计算返回的 行数 和每一行 数据,求得指定 列数据平均值

AVG() 函数 可以与 GROUP BY 一起使用,来计算每个 分组平均值

SUM() 函数

SUM() 是一个求 总和函数,返回指定 列值总和

SUM() 可以与 GROUP BY 一起使用,来计算每个 分组总和

MAX() 函数

MAX() 返回指定 中的 最大值

MAX() 也可以和 GROUP BY 关键字一起使用,求每个 分组 中的 最大值

MAX() 函数 不仅适用于查找 数值类型,也可应用于 字符类型

MIN() 函数

MIN() 返回 查询列 中的 最小值

MIN() 也可以和 GROUP BY 关键字一起使用,求出每个 分组 中的 最小值

MIN() 函数MAX() 函数 类似,不仅适用于查找 数值类型,也可应用于 字符类型

速记

MySQL 聚合函数妙,COUNT、AVG 还有 SUM。
MAX、MIN 也来到,各有本领真不少。
COUNT 统计行数巧,星号全部都算到。
字段名算有技巧,空值行儿全不要。
GROUP BY 一起搞,分组统计呱呱叫。
AVG 求平有高招,行和行数来计较。
分组平均也能搞,GROUP BY 离不了。
SUM 求和没烦恼,指定列值全累到。
分组总和也可靠,GROUP BY 它来罩。
MAX 最大要记牢,数值字符都能找。
分组最大也挺好,GROUP BY 跟着跑。
MIN 最小别忘掉,查找范围同样妙。
数值字符都有效,分组最小呱呱叫。
聚合函数真奇妙,数据处理没困扰。