阅读MySQL必知必会,查缺补漏
MySQL自带数据库
information_schema:是MySQL自带的数据库,主要保持MySQL数据库服务器的系统信息,比如数据库的名称,数据库表的名称,字段名称,存储权限等。
performance_schema:是MySQL系统自带的数据库,可以用来监控MySQL的各类性能指标。
sys:是MySQL系统自带的数据库,主要作用是,以一种更容易被理解的方式展示MySQL数据库服务器的各类性能指标。
MySQL主键
MySQL中的主键主要有3个特征:
- 必须唯一,不能重复
- 不能是空
- 必须可以唯一标识数据表中的记录
alter table demo.test
add column itenumber int primary key auto_increment;
MySQL数据类型
整数类型:
在评估用哪种整数类型的时候,我们需要考虑存储空间和可靠性平衡的问题。使用占用字节数少的整数类型可以节省存储空间,但是如果超出取值范围那么可能会引起系统错误,影响可靠性。
浮点数类型和定点数类型:
FLOAT(单精度浮点数),DOUBLE(双精度浮点数),REAL(默认是DOUBLE)
但是你可以通过这个语句把默认改变。
SET sql_mode = "REAL_AS_FLOAT";
浮点数类型有一个缺陷,就是不精确
那么为什么会出现这样的情况呢?
MySQL对浮点类型数据的存储方式
4个字节存储FLOAT类型,8个字节存储DOUBLE类型数据。但是它们都是用二进制方式来进行存储的。例如9.625用二进制表示,就是1001.101,你可以发现,如果尾数不是0或者5的话那么你无法用一个二进制数来精确的表达,就只能四舍五入了。
于是MySQL提供了定点数类型:DECIMAL
浮点数的存储方式决定了它是不可能精确的,而DECIMAL的存储方式决定了它一定是精确的。
DECIMAL把十进制转换成二进制数存储,DECIMAL则不同,它是把十进制数的整数部分和小数部分拆开,分别转换成十六进制数来进行存储。
DECIMAL(M,D)其中M表示整数加小数一共多少位,M <= 65。D表示小数部分位数,D < M。
文本类型:
CHAR(M):固定长度字符串,必须预先定义字符串长度。
VARCHAR(M):可变长度字符串,必须预先知道字符串的最大长度,不过只要不超过这个最大长度,具体存储的时候,是按照字符串长度存储的。
TEXT:系统自动按照实际长度存储,不需要预先定义,因此TEXT不能做主键。
MySQL的基本操作
有哪些约束?
- 非空约束
- 唯一性约束
- 自增约束
如何修改表?
把原来的表复制一下:
CREATE TABLE demo.importheadhist LIKE demo.importhead;
插入查询结果:
INSERT INTO 表名(字段名)
SELECT 字段名或值
FROM 表名
WHERE 条件
修改数据:
UPDATE 表名
SET 字段名=值
WHERE 条件
查询数据:
- GROUP BY :告诉MySQL查询结果要如何分组,经常与MySQL的聚合函数一起使用。
- HAVING:用于筛选查询结果,跟WHERE类似。
FROM:
FROM关键字表示查询的数据源。
数据源不一定是表,也可以是一个查询结果。
SELECT a.goodsname, a.price
FROM (SELECT *FROM demo.goodsmaster
) AS a;
这个就是派生表:
SELECT *FROM demo.goodsmaster
或者叫做子查询。
意思是我们把一个查询结果数据集当作一共虚拟的数据表来看待。MySQL规定,必须要用AS关键字给这个派生表起一个别名。
ORDER BY:
ASC表示升序,DESC表示降序。
如何设置主键?
- 尽量不要用业务字段,也就是跟业务有关的字段作为主键。
- 使用自增字段做主键(不推荐),多台服务器就寄了。
- 采用手动赋值的方法,通过一定的逻辑性,确保字段值全系统的唯一性。
外键和连接
外键和连接:如何做关联查询?
这种把分散在多个不同的表里面的数据查询出来的操作就叫做多表查询。
在MySQL中为了把2个表关联起来,会用到2个重要功能:外键(FOREIGN KEY)和连接(JOIN)。
外键需要在创建表的阶段就定义出来;连接可以通过相同意义的字段把两个表连接起来用在查询阶段。
如何创建外键?
假设我们有两张表,A和B,它们通过一个公共字段id发生关联关系,我们把这个关联关系叫做R。如果id在表A中是主键,那么表A就是这个关系R中的主表。相应的,表B就是这个关系中的从表,表B中的id,就是表B用来引用表A中数据的,叫外键。所以外键就是从表中用来引用主表数据的那个公共字段。

如何创建外键:
CREATE TABLE 从表名
(-- 定义外键约束,提出外键字段和参照的主表字段CONSTRAINT 外键约束名FOREIGN KEY (字段名) REFERENCES 主表名 (字段名)
)
也可以修改表的字段:
ALTER TABLE 从表名 ADD CONSTRAINT 约束名 FOREIGN KEY 字段名 REFERENCES 主表名
连接:
- 内连接 – 表示查询结果只返回符合连接条件的记录,这种连接方式比较常用。
- 外连接 – 表示查询结果返回某一个表中的所有记录,以及另一个表中满足连接条件的记录。
内连接:
关键字JOIN,INNER JOIN,CROSS JOIN的含义是一样的。
我们定义一个背景:

SELECT a.transactionno,a.itemnumber,a.quantity,a.price,a.transdate,b.membername
FROMdemo.trans AS aJOINdemo.membermaster AS b ON (a.cardno = b.cardno);
可以看到外面通过公共字段cardno把两个表关联到了一起,查询出了会员消费的数据。
关键字JOIN与关键字ON配对使用,意思是查询满足关联条件demo.trans表中cardno的值与demo.membermaster表中的cardno值相等两个表中的所有记录。
外连接:
- 左连接,一般写成
LEFT JOIN,返回左边所有记录以及右表中符合连接条件的记录。 - 右连接,一般写成
RIGHT JOIN,返回右边表中的所有记录,以及左表中符合连接条件的记录。
SELECT a.transactionno,a.itemnumber,a.quantity,a.price,a.transdate,b.membername
FROMdemo.trans AS a -- 这个是左边的表LEFT JOINdemo.membermaster AS b ON (a.cardno = b.cardno);
我们使用右连接也可以完成一样的效果:
SELECT a.transactionno,a.itemnumber,a.quantity,a.price,a.transdate,b.membername
FROMdemo.membermaster AS b -- 这个是左边的表RIGHT JOINdemo.trans AS a ON (a.cardno = b.cardno);
关联查询的误区:
MySQL允许关联查询的时候没有外键的约束。因为外键的约束是要占用系统资源的,如果是高并发的网站的话,这是无法承担的。但是我们既然要关联查询,就说明有两张表,也就是我们的插入或者删除操作是无法用一条SQL语句完成的,也就是没有原子性。所以如果没有外键约束的话,需要在应用层解决原子性的问题,否则会出现业务上的错误。
where和having有什么区别?
WHERE是直接对表中的字段进行限定。HAVING则需要根据分组关键字GROUP BY一起使用,通过对分组字段或分组计算函数进行限定。
- WHERE关键字的特点是,直接用表的字段对数据集进行筛选。如果需要通过关联查询从其他的表获取需要的信息,那么执行的时候,也是先通过WHERE条件进行筛选,用筛选后的比较小的数据集进行连接。这样一来,连接过程中占用的资源比较少,执行效率也比较高。
- HAVING的查询过程:
- 我们需要把所有的信息都准备好,包括从关联表中获取需要的信息,对数据集进行分组,形成一个包含所有需要的信息的数据集合。接着,再通过HAVING条件的筛选,得到需要的数据。
也就是说:
- 如果需要通过连接从关联表中获取需要的数据,WHERE是先筛选后连接,而HAVING是先连接后筛选。这一点就已经决定了WHERE比HAVING更高效。因为WHERE可以先筛选,用一个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。HAVING则需要先把结果集准备好,也就是用没有被筛选的数据集进行关联,然后对这个大的数据集进行筛选,占用资源多,效率低。
- WHERE可以直接把表中的字段作为筛选条件,但是不能使用分组中的计算函数作为筛选条件。HAVING必须要和GROUP BY配合使用,可以把分组计算的函数和分组字段作为筛选条件。
- 因此这也决定了HAVING可以完成WHERE不可能完成的任务。因为在查询语法结构中,WHERE在GROUP BY之前,所以无法对分组结果进行筛选。HAVING在GROUP BY之后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选。
解释一下EXPLAIN之后的字段:
- type=range:使用索引查询特定范围的数据记录
- rows=5411:表示需要读取的记录数
- possible_keys=index_trans:表示可以选择的索引是index_trans
- key=index_trans:表示实际选择的索引是index_trans
- extra=Using index condition;Using where;Using MRR;这里面的信息对SQL语句的执行细节做了进一步解释,包含了3层含义:
- 执行时使用了索引
- 执行时通过WHERE条件进行了筛选
- 使用了顺序磁盘读取的策略
临时表:
临时表是一种特殊的表,用来存储查询的中间结果,并且会随着当前连接的结果而自动删除。MySQL中两种连接表,分别是内部临时表和外部临时表。
- 内部临时表主要用于性能优化,由系统自动产生,我们无法看到
- 外部临时表通过SQL语句创建,我们可以使用
CREATE TEMPORARY TABLE 表名
(字段名 字段类型,...
);
- 临时表创建的时候需要加上格外的
TEMPORARY字段 - 临时表创建完成之后,只有当前连接可见,其他连接是不可见的,具有连接隔离性。
- 临时表在当前连接结束之后,会被自动删除。
内存临时表和磁盘临时表:
内存临时表:
CREATE TEMPORARY TABLE demo.mytrans
(itemnumber int,groupnumber int,branchnumber int
) ENGINE = MEMORY; (临时表存在内存中)
磁盘临时表:
CREATE TEMPORARY TABLE demo.mytrans
(itemnumber int,groupnumber int,branchnumber int
);
内存临时表如果断电的话数据就全部消失了。
高并发系统不建议使用!!!
视图
视图:如何简化查询?
创建视图:
CREATE [OR REPLACE]
VIEW 视图名称 [(字段列表)]
AS 查询语句
- 子查询:嵌套在另一个查询中的查询。
- 派生表:如果我们在查询中把子查询的结果作为一共表来使用,这个表就是派生表
查询的具体步骤是:
- 通过子查询获得单品销售统计的查询结果
- 把第一步中的查询结果作为一个派生表,跟历史库存表进行连接,查询获得包括销售日期,商品名称,销售数量和历史库存数量在内的最终结果。
使用视图的查询语句明显简单多了,可读性更好,也更容易维护。
如果操作视图和视图中的数据?
修改视图:
ALTER VIEW 视图名
AS 查询语句;
查看视图:
DESCRIBE 视图名
删除视图要使用DROP关键字:
DROP VIEW 视图名
视图的优缺点:
优点:
-
因为我们可以把视图当作一张表来进行查询,所以在使用视图的时候,我们不用考虑视图本身是如何获取数据的,里面有什么逻辑,包括了多少张表,有哪些关联操作,而是可以直接使用。这样一来,实际上就把查询模块化了,查询变的简单,提高了开发和维护的效率。所以你可以把那些经常会用到的查询和复杂的子查询定义成视图,存储到数据库中,这样可以为你以后的使用提供方便。
-
视图跟实际数据不一样,它是存储查询语句。所以在使用的时候,我们要通过定义视图的查询语句来获取结果集。而视图本身不存储数据,不占用数据存储的资源。
-
视图具有隔离性。视图相当于在用户和实际的数据表之间加了一层虚拟表。也就是说用户不需要查询数据表,可以直接通过视图获取数据表中的信息。这样不仅提高了数据表的安全性,同时也通过视图把用户实际需要的信息汇总在了一起,查询起来很轻松。

- 视图的数据结构相对独立,即便实际数据表的结构发生变换,我们也可以通过修改定义视图的查询语句,让查询结果集里面的字段保持不变。
我们举一个例子让大家理解:
假设我们有一个实际的数据表(demo.goodsmaster),包括商品编号、条码、名称、规格和售价等信息:



缺点:
- 数据表的更变,需要及时对视图进行维护,特别当视图是由视图生成的时候,维护会变的非常复杂。
MySQL日志
系统出现问题,应该如何及时发现?
我们应该马上看MySQL的日志
通用查询日志:
通用查询日志记录了所有用户的连接开始时间以及截止时间,以及发给MySQL数据库服务器的所有SQL指令。
mysql> SHOW VARIABLES LIKE '%general%';
+------------------+---------------------+
| Variable_name | Value |
+------------------+---------------------+
| general_log | OFF -- 通用查询日志处于关闭状态
| general_log_file | LAPTOP-7IL73D6I.log -- 通用查询日志的名称
+------------------+---------------------+
2 rows in set, 1 warning (0.00 sec)
默认是关闭,因为一旦开启通用查询日志,MySQL会记录所有的连接起止和相关的SQL操作,这样会消耗系统资源并且占用磁盘空间。
开启通用查询日志
set GLOBAL general_log = 'ON';set @@global.general_log_file = 'D:\Lxy';
慢查询日志:
慢查询日志用来记录执行时间超过指定时长的查询。它的作用是帮助我们发现那些执行时间特别长的SQL查询,并且有针对性的进行优化,从而提高系统的整体效率。当我们的数据库发生阻塞,运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。
slow_query_log=1 -- 表示开启慢查询日志,系统将会对慢查询进行记录
slow_query_log_file="GJTECH-PC-slow.log"; -- 表示慢查询日志的名称
long_query_time=10 -- 表示慢查询的标准是查询执行时间超过10秒min_exmined_row_limit=0 -- 表示扫描过的记录大于等于这个变量的值就算慢查询
错误日志:
错误日志中记录了MySQL服务器启动,停止运行的时间,以及系统自动启动,运行和停止过程中的诊断信息,包含错误,警告和提示等。当我们的数据库服务器发生系统故障的时候,错误日志是首选。
log-error="GJTECH-PC.err"
二进制日志:
二进制日志主要数据库的更新事件。比如创建数据库表,更新表中的数据,数据更新所花费的时长等信息。通过这些信息,我们可以再先数据更新的全过程。是数据恢复和数据复制的利器。
如何操作二进制日志?
查看二进制日志主要有3种情况,分别是查看当前正在写入的二进制日志,查看所有的二进制日志和查看二进制日志种的所有数据更新事件。
查看正在写入的二进制日志的SQL语句是:
SHOW MASTER STATUS;
查看所有的二进制文件:
SHOW BINARY LOGS
查看二进制日志中所有数据更新事件的SQL语句:
SHOW BINLOG EVENTS IN 二进制文件名
刷新二进制日志:
FLUSH BINARY LOGS
这条语句的意思是:关闭服务器正在写入的二进制日志文件,并重新打开一个新文件,文件的后缀名在现有的基础上加1.
中继日志:
中继日志只是主从服务器架构存在。
回滚日志:
进行事物回滚。
这些日志太过重要,我们到时候会单独进行讲解。
范式
范式:如何消除冗余和高效存储?
- 第一范式:所有字段都是基本数据字段,不可以进一步拆分
- 第二范式:在满足第一范式的基础上,还要满足数据表里面的每一条记录,都是可唯一标识的。而且所有字段都必须完全依赖主键,不能只依赖主键的一部分。
- 在满足第二范式的基础上,数据表中不能存在可以被其他非主键字段派生出来的字段,或者说,不能存在依赖于非主键字段的字段。
设计表原则
表太大了,如何设计才能提高性能?
-
数据类型优化
-
优化字段的数据类型。
-
对整数类型数据进行优化
-
既可以使用文本类型也可以使用整数类型的字段,要使用整数类型而不是文本类型。
-
-
-
合理增加冗余字段以提高效率
-
拆分表
-
尽量使用非空约束。
- 可以节省一个比特位,并且省去判断是否为空的逻辑。
- 开发时会如果提交给数据库的数据不符合数据库的条件,则会报错。保证开发时不会忽略掉该做的一些非空判断等
- 客户保证逻辑正确
- 安全,防止sql注入
相关文章:
阅读MySQL必知必会,查缺补漏
MySQL自带数据库 information_schema:是MySQL自带的数据库,主要保持MySQL数据库服务器的系统信息,比如数据库的名称,数据库表的名称,字段名称,存储权限等。 performance_schema:是MySQL系统自…...
MySQL数据库10——多表连接查询
数据如果在多个表里面,需要进行连接查询。 一般在pandas里面merge合并会用到一个索引,按这个索引的规则进行合并叫做有规则的等值连接。若不按规则连接,遍历两两组合的所有可能性,叫做笛卡尔积。 笛卡尔积连接 通常人们都会设置…...
华为OD机试 - 括号检查(Python)| 真题含思路
括号检查 题目 现有一字符串 仅由 (,),{,},[,] 六种括号组成,若字符串满足以下条件之一,则为无效字符串 任意类型的左右括号数量不相等 存在未按正确顺序(先左后右)闭合的括号, 输出括号的最大嵌套深度 若字符串无效则输出 0 0 <= 字符串长度 <= 100000 输入 一个只…...
安全渗透测试中的一款免费开源的超级关键词URL采集工具
安全渗透测试中的一款免费开源的超级关键词URL采集工具。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习,切勿用于非法犯罪活动,对于恶意使…...
数据资产管理实践白皮书(6.0版)解读
目录 第一章数据资产管理概述 ( 一 ) 数据资产管理和数据要素的关系...
c/c++开发,无可避免的函数指针使用案例
一、函数指针简介 函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。例如: char* (*pf1)(char * p1,char *p2); 这是一个函数指针,其…...
QT(12)-QThreadPool
1 简介 QThreadPool是Qt框架中的一个类,提供了一组工作线程池。该线程池自动管理一组工作线程,在线程可用时分配任务。使用线程池的主要优点是,它可以减少创建和销毁线程的开销,因为可以重复使用线程。 线程池设计用于场景中&am…...
【Java|golang】1138. 字母板上的路径
我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”],如下所示。 我们可以按下面的指令规则行动: 如果方格存…...
Flink 1.14从简单到源码第三讲
文章目录 1.flink多流操作Api1.1split 分流操作1.2.侧输出流1.3.connect 连接操作1.4.union 操作1.5 coGroup 协同分组1.6 join1.7 broadcast 广播2.process3.并行度和Api3.1 任务提交简单流程3.2 task与算子链4. Flink 时间相关(窗口计算)4.1时间语义(窗口计算)4.2 新版api指定…...
淘宝API接口系列,获取购买到的商品订单列表,卖出的商品订单列表,订单详情,订单物流,买家信息,收货地址列表,买家token
custom自定义API操作buyer_order_list获取购买到的商品订单列表buyer_order_detail获取购买到的商品订单详情buyer_order_express获取购买到的商品订单物流buyer_address_list收货地址列表buyer_address_add添加收货地址buyer_info买家信息buyer_token买家tokenseller_order_li…...
ucos-ii 的任务调度原理和实现
ucosii 任务调度和原理1、ucos-ii 任务创建与任务调度 1.1、任务的创建 当你调用 OSTaskCreate( ) 进行任务的创建的时候,会初始化任务的堆栈、保存cpu的寄存器、创建任务的控制块(OS_TCB)等的操作; if (OSTCBPrioTbl[prio] (OS_…...
Solon2 开发之容器,七、切面与函数环绕拦截
想要环绕拦截一个 Bean 的函数。需要三个前置条件: 通过注解做为“切点”,进行拦截(不能无缘无故给拦了吧?费性能)Bean 的 method 是被代理的在 Bean 被扫描之前,完成环绕拦截的注册 1、定义切点和注册环…...
代码随想录第十天(28)
文章目录28. 找出字符串中第一个匹配项的下标看答案KMPnext数组(前缀表)最长公共前后缀如何计算前缀表前缀表与next数组时间复杂度分析28. 找出字符串中第一个匹配项的下标 莫得思路……好久没做题,都已经忘得差不多了 看答案 其实就是自己…...
循环队列来了解一下!!
笔者在之前的一篇文章,详细的介绍了:队列之单向链表与双向链表的模拟实现:https://blog.csdn.net/weixin_64308540/article/details/128742090?spm1001.2014.3001.5502 感兴趣的各位老铁,可以参考一下啦!下面进入循环…...
Idea打包springboot项目war包,测试通过
pom.xml文件 <!--包名以及版本号,这个是打包时候使用,版本可写可不写,建议写有利于维护系统--> <artifactId>tsgdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <!--打包形式--> <packaging&…...
python+django高校师生健康信息管理系统pycharm
管理员功能模块 4.1登录页面 管理员登录,通过填写注册时输入的用户名、密码、角色进行登录,如图所示。 4.2系统首页 管理员登录进入师生健康信息管理系统可以查看个人中心、学生管理、教师管理、数据收集管理、问卷分类管理、疫情问卷管理、问卷调查管理…...
CUDA中的流序内存分配
文章目录CUDA中的流序内存分配1. Introduction2. Query for Support3. API Fundamentals (cudaMallocAsync and cudaFreeAsync)4. Memory Pools and the cudaMemPool_t注意:设备的内存池当前将是该设备的本地。因此,在不指定内存池的情况下进行分配将始终…...
开源、低成本的 Xilinx FPGA 下载器(高速30MHz)
目前主流的Xilinx下载器主要有两种:一种是Xilinx官方出品的Xilinx Platfom Cable USB,还有一个就是Xilinx的合作伙伴Digilent开发的JTAG-HS3 Programming Cable。 JTAG-HS系列最大支持30MHz下载速度,基于FTDI的FT2232方案。 JTAG-HS系列对比…...
Maven专题总结
1. 什么是Maven Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM: Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和…...
谷粒商城--SPU和SKU
目录 1.SPU和SKU概念 2.表的关系理解 3.导入前端代码 4.完善后端接口 5.属性分组详情 6.规格参数详情 7. 销售属性详情 8.分组与属性关联 9.发布商品 10.仓库服务 1.SPU和SKU概念 SPU:standard product unit(标准化产品单元):是商品信息聚合的…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
