sql
sql…
数据库编码格式
数据库编码是指用于存储和检索数据库中数据的字符集。不同的编码使用不同的字节数来表示不同的字符,这会影响数据存储效率和排序规则。
常见的数据库编码包括:
- ASCII:仅支持英文字母、数字和一些特殊符号,每个字符使用 1 个字节。
- Latin1:是 ASCII 的扩展,支持更多欧洲语言的字符,每个字符使用 1 个字节。
- UTF-8:是一种可变长度编码,支持所有 Unicode 字符,每个字符使用 1-4 个字节。
- GBK:是中文国家标准编码,支持所有中文字符,每个字符使用 2 个字节。
MySQL 字符序命名规则是:以字符序对应的字符集名称开头,以国家名居中(或以 general 居中),以 ci、cs、或 bin 结尾。以 ci 结尾的字符序表示大小写不敏感,以 cs 结尾的字符序表示大小写敏感,以 bin 结尾的字符序表示按二进制编码值比较。
utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8 字符,也就是 Unicode 中的基本多文本平面。
要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持。
对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR 替代 CHAR。
utf8mb4 已成为默认字符集,在 MySQL 8.0.1 及更高版本中将 utf8mb4_0900_ai_ci 作为默认排序规则。以前,utf8mb4_general_ci 是默认排序规则。由于 utf8mb4_0900_ai_ci 排序规则现在是默认排序规则,因此默认情况下新表格可以存储基本多语言平面之外的字符。现在可以默认存储表情符号。如果需要重音灵敏度和区分大小写,则可以使用 utf8mb4_0900_as_cs 代替
IndexedDB
IndexedDB 是类 NoSQL 类型数据库,可以说是没有结构的。通过预设索引,可以快速的根据索引值进行筛选查询;并且可以将任意 JavaScript 变量类型或对象直接存入数据库中,而不需要手动转换。一个数据库中可以包含多种对象集合,相对于 SQL 数据库来说就是多个表;在一个域(名)下,还可以有多个数据库。但是不能跨域访问别的域名之下的数据库。
幂等性
用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
接口幂等性: 以相同的参数,对一个接口进行多次调用,所产生的结果和一次调用是完全相同的。
幂等性是分布式环境下常见的问题;幂等性指的是多次操作,结果是一致的。(多次操作数据库数据是一致的。)
常见的解决幂等性的方式有以下:
- 唯一索引;保证插入的数据只有一条;
- token 机制;每次接口请求前先获取一个 token,然后再下次请求的时候在请求的 header 体中加上这个 token,后台进行验证,如果验证通过删除 token,下次请求再次判断 token
- 悲观锁或者乐观锁,悲观锁可以保证每次 for update 的时候其他 sql 无法 update 数据(在数据库引擎是 innodb 的时候,select 的条件必须是唯一索引,防止锁全表)【分布锁思路】
- 先查询后判断,首先通过查询数据库是否存在数据,如果存在证明已经请求过了,直接拒绝该请求,如果没有存在,就证明是第一次进来,直接放行。
InnoDB 和 MyISAM
mysql5.5 之前的默认存储引擎是 MyISAM,而从 mysql 5.5 开始,默认的存储引擎是 InnoDB。
InnoDB 和 MyISAM 对比
- 事务支持
InnoDB 支持事务(ACID 属性),允许你回滚未提交的更改,并确保数据的一致性。
MyISAM 不支持事务,因此一旦数据被插入或更新,就不能回滚。 - 行级锁定与表级锁定
InnoDB 使用行级锁定,这意味着在高并发情况下,可以同时对不同的行进行读写操作,从而提高效率。
MyISAM 使用表级锁定,当一个查询执行时,整个表会被锁定,这可能会导致其他需要访问该表的操作等待。 - 外键支持
InnoDB 支持外键约束,可以帮助保持数据完整性。
MyISAM 不支持外键。 - 数据和索引存储
InnoDB 将数据和索引存储在同一表空间中,这有助于减少磁盘 I/O 操作。
MyISAM 分别存储数据文件(.MYD)和索引文件(.MYI),这可能在某些情况下提供更快的索引处理速度。 - 故障恢复
InnoDB 提供了更强大的故障恢复机制,通过使用重做日志(Redo Logs)和回滚日志(Undo Logs)来确保数据一致性。
MyISAM 没有内置的故障恢复机制,如果遇到崩溃,可能需要使用操作系统级别的工具来恢复数据。 - 性能
InnoDB 通常更适合写密集型应用,因为它提供了更好的并发控制。
MyISAM 在读密集型应用中表现更好,特别是在不需要事务支持的情况下。 - 存储大小
InnoDB 支持更大的表尺寸,因为它的设计考虑到了可扩展性。
MyISAM 对于较小的数据集来说可能足够用,但对于非常大的数据量可能会遇到限制。
数据库索引
基本介绍
MySQL 官方对索引的定义为:索引(index)是帮助 MySQL 高效获取数据的一种数据结构,本质是排好序的快速查找数据结构。在表数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引
索引是在存储引擎层实现的,所以并没有统一的索引标准,即不同存储引擎的索引的工作方式并不一样
索引使用:一张数据表,用于保存数据;一个索引配置文件,用于保存索引;每个索引都指向了某一个数据
索引类型
主键索引 alter table table_name add primary key(column);
唯一键索引 alter table table_name add unique(column);
普通索引 alter table table_name add index index_name(column);
全文索引 alter table table_name add fulltext(column);
多列索引 alter table table_name add index index_name(column1,column2,column3);
什么时候需要创建索引主键自动建立唯一索引
频繁作为查询条件的字段应该创建索引
查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找
查询中统计或者分组的字段;
什么时候不需要创建索引
频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件
where 条件里用不到的字段,不创建索引;
表记录太少,不需要创建索引;
经常增删改的表;
数据重复且分布平均的字段,因此为经常查询的和经常排序的字段建立索引。注意某些数据包含大量重复数据,因此他建立索引就没有太大的效果,例如性别字段,只有男女,不适合建立索引。
索引结构 B+树
向量数据库和矢量
矢量与向量意思相同,没有区别。
矢量(vector)是一种既有大小又有方向的量,又称为向量。
向量数据库专门用于存储、索引和查询嵌入向量,这些向量是通过机器学习模型传递非结构化数据而生成的。
Milvus 是一个开源矢量数据库,是该领域的领导者。Milvus 提供了许多演示,您可以使用它们来评估向量数据库的功能和用例。随着 Milvus 2.0 GA 的发布,Milvus 现在是一个云原生的容错系统,能够扩展到数十亿个向量甚至更多。
mysql5.7 和 8.0 的区别
mysql 高可用
集群部署
Mysql Cluster 是官方的实现的高可用方案
主从复制
能实现读写分离,配置好数据库后用
sharding-jdbc-spring-boot-starter–>yml 配置主从数据库 shardingsphere–>allow-bean-definition-overriding=true分库分表
sql 调优
事务
子查询
存储过程
redolog 和 binlog
表的设计规范(数据库三范式)
表的拆分
- 垂直分表
将一个表的字段分散到多个表中,每个表存储其中一部分字段
拆分规则:
- 不常用的字段单独一张表
- text,blob 类型的数据单独一张表
- 经常组合查询的字段单独一张表
sql 语句
- limit 语法
1 | -- #默认从第 0 行开始,取 10 条数据 |
其他
“Where 1=1” 是一种常用的 SQL 语句,它不会过滤任何结果。它通常用作动态 SQL 查询中的占位符,在这种情况下,可以根据某些条件添加其他过滤条件。
mysql 隐式转换
1 | update db_name set selling_price = xx,sell_type = xx where id = 0; |