From e1fe402e684bfe295b28ad5cea9dad9bf4fcbf5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E5=B0=8F=E7=87=95=EF=BC=88=E5=BF=97=E4=B8=87?= =?UTF-8?q?=E4=BC=A0=E5=AA=92=EF=BC=89?= Date: Fri, 18 Oct 2024 16:27:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\270\232\357\274\21022\357\274\211.md" | 21 ++-- ...\344\271\240\357\274\21023\357\274\211.md" | 102 ++++++++++++++++++ 2 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 "\351\203\255\345\260\217\347\207\225/20241018 \347\264\242\345\274\225\344\275\234\344\270\232\345\222\214\347\273\203\344\271\240\357\274\21023\357\274\211.md" diff --git "a/\351\203\255\345\260\217\347\207\225/20241017 \344\272\213\345\212\241\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232\357\274\21022\357\274\211.md" "b/\351\203\255\345\260\217\347\207\225/20241017 \344\272\213\345\212\241\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232\357\274\21022\357\274\211.md" index 0da51ce..2fa0ff2 100644 --- "a/\351\203\255\345\260\217\347\207\225/20241017 \344\272\213\345\212\241\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232\357\274\21022\357\274\211.md" +++ "b/\351\203\255\345\260\217\347\207\225/20241017 \344\272\213\345\212\241\347\273\203\344\271\240\344\270\216\344\275\234\344\270\232\357\274\21022\357\274\211.md" @@ -15,6 +15,7 @@ 可以包含多条命令,但用户必须显式或隐式地关闭自动提交。 ```sql +set @@autocommit=1;-- 开启系统自动提交 set @@autocommit=0; -- 将系统变量中的自动提交改为禁用 start transaction; -- 开启事务 commit; -- 提交事务 @@ -22,31 +23,37 @@ rollback; -- 回滚 savepoint 保存点名字; -- 设置保存点 rollback to 保存点名字; -- 回滚到保存点 -release savepoint 保存点名字; -- 删除保存点 - +release savepoint 保存点名字; -- 删除保存点 ``` +(1)原子性(Atomicity):事务中多条SQL语句作为一个整体被执行,事务中的全部操作要么全部成功执行,要么都不执行。 +(2)一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态,要么同时成功要么同时失败。 +(3)隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。 + (4)持久性(Durability):已提交的事务对数据库的修改应该永久保存在数据库中。 + +> 习惯上取这4 个特性英文单词的首字母,称之为ACID 特性。 + ### 二. 事务的隔离isolation级别 - MySQL 提供了4种隔离级别。 +#### MySQL 提供了4种隔离级别。 -第一级别:读未提交(Read Uncommitted), +**第一级别:读未提交(Read Uncommitted),** - 表现形式:A事务还没有提交,B事务可以读取到A事务未提交的数据。 - 存在问题:读未提交存在脏读(Dirty Read)现象-->表示读到了脏的数据。 - 脏读是指在并发执行的两个事务中,一个事务读到了另一个事务尚未提交的数据。这个数据可能会被回滚【不存在】。 - 第二级别:读已提交(Read Committed), A事务提交之后的数据,B事务可以读取到。这种级别隔离解决了前一种的脏读现 + **第二级别:读已提交(Read Committed), A事务提交之后的数据,B事务可以读取到。这种级别隔离解决了前一种的脏读现** - 读已提交数据存在的问题是:不可重复读。 - 不可重复读是指在同一个事务中,由于其他事务的干扰,导致同一查询语句返回的结果不同,即A事务提交前后,B事务前后查询的结果不一致。 -第三级别:可重复读(Reapeatable Read),重复多次读取的数据都是和第一次一样。 +**第三级别:可重复读(Reapeatable Read),重复多次读取的数据都是和第一次一样。** - 这种隔离级别解决了:不可重复读问题。 - 这种隔离存在的问题:可能读取到的数据是幻象,即不真实的数据 。 -第四级别:序列化读/串行化读(serializable), 排队机制,解决了所有问题 +**第四级别:序列化读/串行化读(serializable), 排队机制,解决了所有问题** - 效率底。需要事务排队。 diff --git "a/\351\203\255\345\260\217\347\207\225/20241018 \347\264\242\345\274\225\344\275\234\344\270\232\345\222\214\347\273\203\344\271\240\357\274\21023\357\274\211.md" "b/\351\203\255\345\260\217\347\207\225/20241018 \347\264\242\345\274\225\344\275\234\344\270\232\345\222\214\347\273\203\344\271\240\357\274\21023\357\274\211.md" new file mode 100644 index 0000000..d9998c9 --- /dev/null +++ "b/\351\203\255\345\260\217\347\207\225/20241018 \347\264\242\345\274\225\344\275\234\344\270\232\345\222\214\347\273\203\344\271\240\357\274\21023\357\274\211.md" @@ -0,0 +1,102 @@ +# 20241018 索引作业和练习 + +### 1. **索引的概念** + +- **定义**:索引是数据库表中一个特殊的数据结构,用于快速查找和访问表中的数据。它类似于书籍的目录。 +- **作用**:加速数据检索,优化查询性能,避免全表扫描。 + +### 2. **索引的类型** + +- **单列索引**:只包含单个列的索引。 +- **复合索引**:由多个列组成的索引,用于加速涉及多个列的查询。 +- **唯一索引**:确保索引列中的值是唯一的,不允许重复。 +- **主键索引**:一种特殊的唯一索引,且不允许为空,通常用于唯一标识一行数据。 +- **全文索引**:用于对文本数据进行全文检索,主要用于查找大文本字段中的关键词。 +- **空间索引**:用于地理数据类型的索引,加速空间查询。 + +### 练习 + +```sql +-- 练习和作业 +-- 1.给emp分别建立 普通索引和唯一索引 + +CREATE INDEX idx_job on emp(job);-- 普通索引 + +CREATE UNIQUE INDEX idx_ename on emp(ename);-- 唯一索引 + +-- 2.查询emp表有哪些索引 + +SHOW INDEX from emp; + +-- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 + +explain SELECT * FROM emp WHERE ename = '刘备'; + +-- 4. 删除前面建立的两个索引 + +DROP INDEX idx_job on emp; + +DROP INDEX idx_ename on emp; + +-- 5. 选择两个字段添加一个复合索引 + +CREATE INDEX idx_job_dep on emp(job,deptno); + +-- 6. 使用复合索引的字段进行查询 + +explain SELECT * FROM emp WHERE job = '销售员' and deptno = 30; + + +``` + +![{12FBC60F-ECB7-4E2A-AB7E-A7D1E4D93C4C}](https://gitee.com/crane-stack/picture/raw/master/202410181102828.png) + +![{DC148E14-21ED-47B7-8A39-5FD78C45AFEC}](https://gitee.com/crane-stack/picture/raw/master/202410181104326.png) + +![{3FEC0A31-2207-43CB-9342-E5F095DCD570}](https://gitee.com/crane-stack/picture/raw/master/202410181104501.png) + +```sql +-- 作业 +-- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 + +CREATE TABLE random_num( + id INT AUTO_INCREMENT PRIMARY KEY, + uname VARCHAR(255), + age INT +); + +CREATE PROCEDURE random_number() +BEGIN + DECLARE i INT DEFAULT 0; + WHILE i < 5000000 DO + INSERT INTO random_num (uname, age) VALUES (CONCAT('user', FLOOR(RAND() * 5000000)), FLOOR(RAND() * 100)); + -- 向random_num表插入随机数据 + -- CONCAT('user', FLOOR(RAND() * 5000000))生成一个随机的uname, + -- 格式为"userXXXXXX",XXXXXX是0到4999999之间的随机数 + -- FLOOR(RAND() * 100)生成一个0到99之间的随机整数作为age + -- i的值每次循环加1,直到达到5000000 + SET i = i + 1; + END WHILE; +END; + +CALL random_number(); + + +-- 1. 不用索引查询 一次姓名uname /并记录时间 + +SELECT * FROM random_num WHERE uname = 'user692051'; -- 假设我们知道某个uname + + +-- 2. 建立索引查询 一次姓名uname /并记录时间 + +CREATE INDEX idx_uname ON random_num(uname); + +SELECT * FROM random_num WHERE uname = 'user692051'; -- 使用相同的uname + +``` + +![782bed87191891c96bad14b33b0f4f7](https://gitee.com/crane-stack/picture/raw/master/202410181621310.png) + +![8b10a0021a6118e8e8e29fcc9a90b44](https://gitee.com/crane-stack/picture/raw/master/202410181621907.png) + +![2dab9f8572eda2fab5cd7543edccdaf](https://gitee.com/crane-stack/picture/raw/master/202410181621969.png) \ No newline at end of file -- Gitee