数据库笔记

2026-7-17

原始笔记链接:https://cloud.seatable.cn/dtable/external-links/59b453a8639945478de2/

0113 数据库事务处理是什么

事务处理:某一组操作是一个原子操作,如果中途无法执行,就回退到开始的状态。不能执行到一半执行停止执行。

实例:删除一个用户时,用户的各种信息分别在不同的表中存储,那么这组操作就包括多个删除 SQL 语句,就是一个 commit。例如删除用户的基本信息,用户的评论,用户的操作日志等。如果删除用户评论时,发现找不到这个用户,那么应该提示错误并回退到之前的状态,而不应该继续执行,或者执行一半。

1
2
3
4
5
START TRANSATION
DELETE FROM USERS WHERE user_id = 002;
DELETE FROM COMMENTS WHERE user_id = 002;
DELETE FROM OPERATIONS WHERE user_id = 002;
COMMIT;

0377 mysql 中主键外键是什么

mysql 中不同表通过主键和外键建立关联,进行约束,确保了数据一致性。

根据不同表的关联关系,确定主键和外键。

如果是一对多的关系(例如用户表和评论表),那么用户表的 id 就是主键,在评论表中建立 user_id 作为外键。

如果是多对多的关系(例如用户表和图书表),那么需要新建一个中间表,user_book 存放外键。用户表中 id 是主键,图书表中 id 也是主键,user_book 表中,新建 book_id 和 user_id 作为外键,进行关联和约束。

主键是唯一的,确保了数据增删改的联动性。

0888 数据库视图是什么

视图是基于一个或多个基本表的查询结果的虚拟表。

它是一个逻辑概念,不实际存储数据,但可以像基本表一样使用。

视图是通过 SELECT 语句创建的,并可以对其进行查询、插入、更新和删除等操作。

视图的主要作用,简化复杂查询和保护数据的安全性。

通过创建视图,可以隐藏底层表结构和数据,只暴露需要的信息给用户。

视图还可以将多个表的数据合并到一个虚拟表中,简化查询操作。

1、特点

  • 不存储实际数据,只保存查询定义

  • 可以像基本表一样使用,进行CRUD操作

  • 可以简化复杂查询和保护数据安全

2、优点

简化查询:通过创建视图,可以将复杂的查询操作封装成一个简单的查询语句,并且可以重复使用。

数据安全:通过视图,可以隐藏底层表的结构和数据,只暴露必要的信息给用户。可以给用户授予对视图的访问权限,而不直接访问基本表,从而提高数据的安全性。

数据一致性:通过视图,可以将多个相关的表的数据合并到一个虚拟表中,保证了数据的一致性。

3、缺点

查询效率:视图的查询效率可能会低于直接查询基本表,因为视图需要在查询时动态生成结果。

更新限制:由于视图是基于基本表的查询结果,对视图的更新操作可能会受到限制。例如,视图中使用了聚合函数或 GROUP BY 子句,则不能对视图进行更新。

存储空间:虽然视图不存储实际数据,但是需要占用一定的存储空间来保存查询定义。

4、用途

简化复杂查询:通过将复杂的查询逻辑封装到视图中,可以简化应用程序中的查询操作。

数据安全性:视图可以限制用户对底层表的访问权限,从而提供更高的数据安全性和隐私保护。

数据抽象和封装:通过视图,可以将多个表的数据抽象为一个虚拟表,简化数据模型和应用程序开发。

性能优化:视图可以预先计算和存储结果集,以提高查询性能,并避免重复执行复杂查询。

基本使用

视图的增删和表类似

1
2
3
4
CREATE VIEW view_name AS
SELECT column1, column2
FROM table1, table2
WHERE conditions;

案例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 创建数据库表,并插入数值
create table t(quantity int, price int);

insert into t values (3,50);
insert into t values (4,100);

# 创建视图1
create view view_t as select quantity, price, quantity * price from t;
select * from view_t;

# 创建视图2
CREATE VIEW view_t2(qty, price, total) AS SELECT quantity, price, quantity * price FROM t;
select * from view_t2;

参考链接

https://blog.csdn.net/qq_21891743/article/details/132590386

https://blog.csdn.net/2301_78341899/article/details/131533874

0819 mysql 如何支持 emoji 表情

这是 mysql 字符集的问题,如果是 emoji 表情发送失败,原因是数据库不能存储 emoji 表情,需要修改 mysql 的配置,将字符类型修改为 utf8mb4。

mysql 的 utf-8 编码的一个字符最多 3 个字节,但是一个 emoji 表情为 4 个字节,所以 utf-8 不支持储存 emoji 表情,但是 utf-8 的超集 utf8mb4 一个字符最多能有 4 个字节,所以能够支持 emoji 的表情存储。

找到/etc/mysql 路径下有 my.cnf 文件,添加如下的配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[client]
default-character-set=utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

[mysql]
default-character-set=utf8mb4

重启 mysql 的服务:

1
service mysqld restart

0687 elastic search 的基本原理

安装和环境:elastic search 是一个单独 java 服务;默认端口是 9200

搜索原理:类似数据库增加索引,elastic 对于文本内容也增加了索引(具体的中文分词、英文分词、构建字典树等细节不考虑)。增加索引后,对全文搜索性能更好。

关键词:节点 Node,集群 cluster,索引 Index,文档 Document。

每一个 elastic 是一个节点,多个节点构成分布式集群。每一个索引,包括多个文档。

搜索步骤:

通过 API 建立删除索引

1
2
3
PUT localhost:9200/novel

DELETE localhost:9200/novel

设置中文分词(创建索引时,增加配置)“analyzer”: “ik_max_word” 表示分词器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
curl -X PUT 'localhost:9200/accounts' -d '

{
  "mappings": {
    "person": {
      "properties": {
        "user": {
          "type": "text",
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_max_word"
        },
        "title": {
          "type": "text",
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_max_word"
        },
        "desc": {
          "type": "text",
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_max_word"
        }
      }
    }
  }
}'

参考:

https://www.ruanyifeng.com/blog/2017/08/elasticsearch.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html

https://www.elastic.co/cn/blog/a-practical-introduction-to-elasticsearch

0296 MYSQL 高并发性能问题

Mysql 高并发性能问题

问题:mysql 分布式还不完善,所以存在高并发的问题。如果并行请求很多,mysql 锁无法合理分配资源,产生延时。

解决

1、分库分表:利用已有的MySQL资源,将原来的数据表拆分成多个数据库(或者表),同时支持多个SQL的查询,可以在一定程度上提升查询性能。

2、缓存技术:使用缓存可以减少MySQL服务器的查询压力,提高数据的读取速度,降低内存的占用。常用的缓存技术有Redis、Memcache等,可以将MySQL查询和处理的结果缓存起来,实现简单的数据一次查询,多次引用的功能。

3、HTTP集群:通过市面上常用的反向代理负载均衡技术,将网站服务器的查询压力分散到多台服务器上,从而提升MySQL的性能和容量。

4、优化SQL语句:通过在查询语句中添加索引、减少冗余数据等步骤,提升表之间关联查询、语句执行速度以及内存容量。

参考链接

https://www.dbs724.com/157170.html

https://blog.csdn.net/weixin_40990818/article/details/113704102

https://juejin.cn/post/7163894728201601060

0378 mysql 中如何优化

mysql 初级使用不涉及复杂算法

如果遇到慢查询时:mysql 建立索引时,实际上就是线性查找,转换成映射查找(建立索引,具体算法不一样),可以提高查询的速度。

0380 mysql 和 mariaDB 的区别

https://blog.csdn.net/sensor_WU/article/details/129646422

相同点:mysql 和 mariaDB 都是关系型数据库,主要功能相同。MariaDB是MySQL的一个分支,由开源社区维护,采用GPL授权许可,完全兼容MySQL。

发展历史:mysql 早期是个人开发者发布,随后被 Sun 收购,随后 2008 年被 Oracle 收购,走上了商业化道路(收费)。2009年 mysql 创始人在新的分支上创建了 mariaDB,使用 GPL 许可证,代码开源。

主要区别:mysql 存储引擎是 innoDB, mariaDB 存储引擎是 XtraDB,有一些性能差异。

0891 ORM 对象关系映射

对象关系映射,Object relationship mapping

ORM 框架是一种用于解决编程语言中的对象模型,与关系型数据库中数据模型之间不匹配问题,的技术框架。

核心:建立对象与数据库表之间的映射关系,让开发者可以直接使用面向对象的方式(如操作类、对象、方法)来操作数据库,而无需编写复杂的 SQL 语句。

Python 领域的 ORM 框架:SQLAlchemy、Django ORM

ORM 优势:

  1. 简化数据库操作:用熟悉的面向对象语法(如创建对象、调用方法)替代 SQL 语句,降低了数据库操作的复杂度。

  2. 隔离数据库差异:屏蔽了不同数据库(如 MySQL、PostgreSQL、Oracle 等)的 SQL 语法差异,切换数据库时无需大量修改代码。

  3. 提高开发效率:减少了重复编写 SQL 的工作量,让开发者更专注于业务逻辑而非数据访问细节。

  4. 增强代码可维护性:将数据访问逻辑集中管理,便于后期修改和维护。

0899 强制删除外键的数据库表

通常,删除数据库表,执行

1
DROP TABLE IF EXISTS project_connection;

如果这个表和其他的表存在多个外键关联,又必须删除(本地测试可以这样操作),执行下面的脚本,强制删除表

1
2
3
4
5
6
7
8
-- 临时禁用外键约束检查
SET FOREIGN_KEY_CHECKS = 0;

-- 删除表
DROP TABLE IF EXISTS project_connection;

-- 恢复外键约束检查(重要!)
SET FOREIGN_KEY_CHECKS = 1;

0489 数据库 schema 是什么意思

schema 是数据库的组织和结构,包含了表、列、数据类型、视图、存储过程、关系、主键、外键等数据库对象。

  • 组织和结构:Schema 在数据库中起到了组织和结构化的作用,它定义了数据库的结构和对象之间的关系,使得数据存储和检索更加有序和高效。‌

  • 命名空间和对象集合:Schema在数据库中形成了一个命名空间,允许多个用户使用同一个数据库而不会相互干扰。它包含了表和其他数据库对象,如数据类型、函数、操作符等。‌

  • 避免名称冲突:通过将数据库对象组织成逻辑组,Schema有助于避免对象名称的冲突

  • 数据完整性和业务逻辑:Schema还通过定义约束和规则来确保数据的完整性和一致性,如唯一约束和非空约束,有助于维护数据的质量和准确性。

  • 可视化表示:在可视化工具中,Schema可以通过关系图表来表示,显示数据库对象及其之间的关系。‌