diff --git "a/\345\207\241\345\205\211\344\271\220/20240927\345\255\230\345\202\250\350\277\207\347\250\213\345\210\244\346\226\255.md" "b/\345\207\241\345\205\211\344\271\220/20240927\345\255\230\345\202\250\350\277\207\347\250\213\345\210\244\346\226\255\345\222\214\345\276\252\347\216\257.md" similarity index 100% rename from "\345\207\241\345\205\211\344\271\220/20240927\345\255\230\345\202\250\350\277\207\347\250\213\345\210\244\346\226\255.md" rename to "\345\207\241\345\205\211\344\271\220/20240927\345\255\230\345\202\250\350\277\207\347\250\213\345\210\244\346\226\255\345\222\214\345\276\252\347\216\257.md" diff --git "a/\345\207\241\345\205\211\344\271\220/20241018\347\264\242\345\274\225\344\275\234\344\270\232.md" "b/\345\207\241\345\205\211\344\271\220/20241018\347\264\242\345\274\225\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..18e65cbc89a77dd1f1f42735f4a400546e2f0240 --- /dev/null +++ "b/\345\207\241\345\205\211\344\271\220/20241018\347\264\242\345\274\225\344\275\234\344\270\232.md" @@ -0,0 +1,367 @@ +### 一、课堂笔记 + +1、mysql索引:是一种数据结构,用于加快数据库查询的速度和性能。 + +2、索引分单列索引和组合索引: + +- 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引。 +- 组合索引,即一个索引包含多个列 + +3、注意: + +- 索引需要占用额外的存储空间。 +- 对表进行插入、更新和删除操作时,索引需要维护,可能会影响性能。 +- 过多或不合理的索引可能会导致性能下降,因此需要谨慎选择和规划索引。 + +### 二、普通索引: + +通过使用索引,mysql可以直接定位到满足查询条件的数据行,而无需逐行扫描整个表。 + +#### 创建索引: + +##### create index 的语法: + +```sql +create index idx_name on table_name(column 1 asc|desc,column 2 asc|desc) ; +``` + +1、create index :用于创建普通索引的关键字。 + +2、index_name:索引名称。索引名称在表中必须是唯一的。 + +3、table_name:指定在哪个表上创建索引。 + +4、(column 1,column 2):指定要索引的列表名,可以指定一个或多个列作为索引的组合。这些列的数据类型通常是数值、文本或日期 + +5、asc和desc(可选):用于指定索引的排序顺序。默认情况下。索引以升序(asc)排序。 + +##### 实例: + +```sql +create index idx_name on student (name); +-- 上述语句将在 students 表的 name 列上创建一个名为 idx_name 的普通索引 +``` + +#### 修改表结构: + +##### alter table 创建索引的语法: + +```sql +alter table (用于修改表结构的关键字) table_name(要修改表的名称。) add index(添加索引的子句)index_name (要创建的索引名称)(column 1 asc|desc,column 2 asc|desc) (指定要索引的列表名); +``` + +1、`alter table` :用于修改表结构的关键字。 + +2、`table_name`:要修改表的名称。 + +3、`add index`:添加索引的子句。add index 用于创建普通索引。 + +4、`index_name`:指定要创建的索引名称。索引名称在表中必须是唯一的。 + +5、`(column 1,column 2)`:指定要索引的列表名,可以指定一个或多个列作为索引的组合。这些列的数据类型通常是数值、文本或日期。 + +6、asc和desc(可选):用于指定索引的排序顺序。默认情况下。索引以升序(asc)排序。 + +##### 实例: + +```sql +alter table emp add index idx_age (age); + +-- 上述语句将在 emp 表的 age 列上创建一个名为 idx_age 的普通索引。 +``` + +#### 创建表的时候直接指定: + +##### 例子: + +```sql +create table table_name( +column1 data_type, + column2 data_type, + ..., + index index_name (column1 asc|desc,column2) +); +``` + +1、`CREATE TABLE`: 用于创建新表的关键字。 + +2、`table_name`:创建表的名称。 + +3、`(column1 data_type, column2 data_type, ...)`: 定义表的列名和数据类型。 + +4、`INDEX`: 用于创建普通索引的关键字 + +5、`index_name`:要创建的索引的名称。索引名称在表中必须是唯一的。 + +6、`(column1, column2, ...)`: 指定要索引的表列名。你可以指定一个或多个列作为索引的组合。这些列的数据类型通常是数值、文本或日期。 + +7、asc和desc(可选):用于指定索引的排序顺序。默认情况下。索引以升序(asc)排序。 + +##### 实例: + +```sql +CREATE TABLE students ( + id INT PRIMARY KEY, + name VARCHAR(50), + age INT, + INDEX idx_age (age) +); + +-- 在上述实例中,我们在 students 表的 age 列上创建了一个名为 idx_age 的普通索引。 +``` + +#### 删除索引的语法: + +##### DROP INDEX 的语法: + +```sql +drop index index_name on table_name; +``` + +1、`DROP INDEX`: 用于删除索引的关键字。 + +2、`index_name`: 指定要删除的索引的名称。 + +3、`ON table_name`: 指定要在哪个表上删除索引。 + +##### 使用 **ALTER TABLE** 语句删除索引的语法如下: + +```sql +ALTER TABLE table_name +DROP INDEX index_name; +``` + +1、`ALTER TABLE`: 用于修改表结构的关键字。 + +2、`table_name`: 指定要修改的表的名称。 + +3、`DROP INDEX`: 用于删除索引的子句。 + +4、`index_name`: 指定要删除的索引的名称。 + +##### 实例: + +```sql +drop index idx_age on emp; + +或: + +alter table emp +drop index idx_name; +``` + +#### 检查是否使用了索引: + +##### 使用关键字explain: + +```sql +explain select * from idx_eid (索引名称) where = 1; +``` + + + + + + + +### 三、唯一索引: + +在 MySQL 中,你可以使用 **CREATE UNIQUE INDEX** 语句来创建唯一索引。 + +唯一索引确保索引中的值是唯一的,不允许有重复值。 + +#### 创建索引: + +##### 语法: + +```sql +CREATE UNIQUE INDEX index_name +ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...); + +``` + +##### 实例: + +```sql +CREATE UNIQUE INDEX idx_email ON employees (email); +``` + +#### 修改表结构添加索引(alter table): + +##### 语法: + +```sql +alter table table_name +add constraint unique_constraint_name UNIQUE (column1, column2, ...); +``` + +- `ADD CONSTRAINT`: 这是用于添加约束(包括唯一索引)的关键字。 +- `unique_constraint_name `: 指定要创建的唯一索引的名称,约束名称在表中必须是唯一的。 +- `UNIQUE (column1, column2, ...)`: 指定要索引的表列名。你可以指定一个或多个列作为索引的组合。这些列的数据类型通常是数值、文本或日期。 + +##### 实例: + +```sql +ALTER TABLE employees +ADD CONSTRAINT idx_email UNIQUE (email); +``` + +#### 创建表的时候直接指定: + +```sql +CREATE TABLE table_name ( + column1 data_type, + column2 data_type, + ..., + constraint index_name UNIQUE (column1 [ASC|DESC], column2 [ASC|DESC], ...) +); + +``` + +#### 四、显示索引信息 + +**SHOW INDEX** 语句: + +```sql + show index from table_name(表名称); +``` + +#### 五、练习与作业 + +```sql +-- 练习和作业 +-- 1.给emp分别建立 普通索引和唯一索引 +CREATE INDEX idx_name on emp (ename); + +CREATE INDEX idx_id on emp(empno); + +CREATE UNIQUE INDEX idx_id on emp(empno); + + +-- 2.查询emp表有哪些索引 +SHOW INDEX FROM emp; + +-- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 +SELECT * FROM emp WHERE empno = 1002; +EXPLAIN SELECT * FROM emp WHERE empno = 1002; + +-- 4. 删除前面建立的两个索引 +DROP INDEX idx_name on emp; +ALTER TABLE emp DROP INDEX idx_name; + +DROP INDEX idx_id on emp; +ALTER TABLE emp DROP INDEX idx_id; + +-- 5. 选择两个字段添加一个复合索引 +CREATE INDEX idx_sal_comm on emp (sal,comm); +-- 查询来测试它是否生效: +SELECT *FROM emp WHERE sal =16100.00 AND comm = 3200.00; +-- 检查这个查询是否使用了复合索引 +EXPLAIN SELECT *FROM emp WHERE sal =16100.00 AND comm = 3200.00; + +-- 6. 使用复合索引的字段进行查询 +SELECT * FROM emp WHERE sal=16100.00 AND comm = 3200.00; + + +-- 数据准备 + +CREATE DATABASE random_db; +use random_db; +CREATE TABLE random( +id int auto_increment PRIMARY key, +uname VARCHAR(255) not null, +age INT not null + +); + + +-- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 +DROP PROCEDURE produce_random_db; +delimiter// + +CREATE PROCEDURE produce_random_db(in num_row INT) +BEGIN +DECLARE random_id int DEFAULT 1; +DECLARE random_uname VARCHAR(255); +DECLARE random_age int ; + +WHILE random_id <= num_row DO + + -- 生成随机用户名 + -- RAND():用于生成一个介于 0 和 1 之间的随机浮点数。 + -- MD5():生成的字符串长度是32位,是一种广泛使用的哈希算法。 + -- SUBSTRING():用于从一个字符串中提取子字符串。 + + #思路: +-- 首先,使用 RAND() 函数生成一个随机数。 +-- 然后,将这个随机数传递给 MD5() 函数,生成一个 32 位的十六进制哈希值。 +-- 最后,使用 SUBSTRING() 函数从这个哈希值的开头提取前 8 个字符。 +-- + set random_uname = SUBSTRING(MD5(RAND()), 1, 8); + + -- 生成随机年龄 + -- FLOOR():返回小于或等于 `x` 的最大整数(向下取整)。 + SET random_age = FLOOR(1+(RAND()*100)); + + -- 插入数据 + INSERT into random (uname,age) VALUES (random_uname,random_age); + + -- 递增计数器 + SET random_id = random_id +1; + +END WHILE; + +END// + +delimiter; + + +CALL produce_random_db(5000000); + + +``` + +![](https://gitee.com/fan-guangle/fgls-image-bed/raw/master/imges/202410191440790.bmp) + + + +1. 不用索引查询 一次姓名uname /并记录时间 + +```sql +SELECT * FROM random WHERE uname = '4039855c' ; +``` + +![](https://gitee.com/fan-guangle/fgls-image-bed/raw/master/imges/202410191440756.bmp) + +2. 建立索引查询 一次姓名uname /并记录时间 + +```sql +DROP INDEX idx_uname on random; +CREATE INDEX idx_uname on random (uname); +SELECT* FROM random WHERE uname = '4039855c'; +``` + +![](https://gitee.com/fan-guangle/fgls-image-bed/raw/master/imges/202410191441237.bmp) + + + + + + + + + + + + + + + + + + + + + + +