From f7551c72a00399f0a0c39441fa17fdc2bfda96a9 Mon Sep 17 00:00:00 2001 From: WLL_LL <2923443262@qq.com> Date: Sun, 20 Oct 2024 23:03:40 +0800 Subject: [PATCH] 20241020 --- .../20241018\347\264\242\345\274\225.md" | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 "\351\237\246\345\212\233\350\216\211/20241018\347\264\242\345\274\225.md" diff --git "a/\351\237\246\345\212\233\350\216\211/20241018\347\264\242\345\274\225.md" "b/\351\237\246\345\212\233\350\216\211/20241018\347\264\242\345\274\225.md" new file mode 100644 index 0000000..81a401d --- /dev/null +++ "b/\351\237\246\345\212\233\350\216\211/20241018\347\264\242\345\274\225.md" @@ -0,0 +1,171 @@ +# 索引 + +- 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息 +- 一种能帮助mysql提高了查询效率的数据结构:索引数据结构 + +## 索引分类 + +- **单列索引**:只包含单个列的索引。 +- **复合索引**:由多个列组成的索引,用于加速涉及多个列的查询。 +- **唯一索引**:确保索引列中的值是唯一的,不允许重复。 +- **主键索引**:一种特殊的唯一索引,且不允许为空,通常用于唯一标识一行数据。 +- **全文索引**:用于对文本数据进行全文检索,主要用于查找大文本字段中的关键词。 +- **空间索引**:用于地理数据类型的索引,加速空间查询。 + +### **创建索引** + +使用 `CREATE INDEX` 语句可以创建索引: + +```sql +CREATE INDEX index_name ON table_name(column1, column2, ...); +``` + +- **示例**: + +```sql +CREATE INDEX idx_name ON employees(last_name); +``` + +```sql +# 其它方法 +alter table table_name add index idx (xx); +alter table table_c add index idx_c (uname); +-- 建表时 +create table table_b( +id int PRIMARY key auto_increment, +uname varchar(10), +index idx_b (uname) +); +``` + +**普通索引** + +``` +方法一 +create index index_name on table_name(字段); +方法二 +在创建一个表结构时就创建索引 +create table +``` + +**唯一索引** + +``` +create unique index unique_name on table_name(字段); +见名知义,索引列中的值必须是唯一的,但是允许为空值,其中字段就是唯一索引 +``` + +**主键索引** + +``` +当把某个列设为主键的时候则该列就是主键索引 +create table a ( +id int primary key auto_increment, +name varchar(255) not null default +); +或者 +alter table a add primary key(id) +``` + +**组合索引** + +``` +用多个列组合构建的索引 +alter table table_name add index index_name(a,b,c); +组合索引遵循最左原则,使用时最好把最常用作为检索或者排序的列放在最左,依次递减 +``` + + + +### 索引的使用** + +- **自动创建索引**:在创建主键、唯一约束、外键等时,MySQL会自动创建索引。 +- **查询优化**:使用索引可以加速`SELECT`语句,特别是在`WHERE`、`ORDER BY`、`JOIN`等操作中。 + +### **查看索引** + +使用 `SHOW INDEX FROM table_name;` 可以查看表中的索引信息。 + +### **删除索引** + +使用 `DROP INDEX` 语句删除索引: + +```sql +DROP INDEX index_name ON table_name; +-- 其它 +alter table table_a drop index idx_a; +``` + +- **示例**: + +```sql +DROP INDEX idx_name ON employees; +``` + +### **使用场景** + +- 在需要频繁查询的列上创建索引。 +- 对于大表的经常使用的查询,尤其是涉及到排序和过滤的查询。 + + + +### **性能监控** + +使用 `EXPLAIN` 语句可以查看查询的执行计划,分析索引的使用情况: + +```sql +EXPLAIN SELECT * FROM employees WHERE last_name = 'Smith'; +``` + +复合索引(联合索引),使用要遵循最左原则。 + +```sql +-- 练习和作业 +-- 1.给emp分别建立 普通索引和唯一索引 +CREATE INDEX index_emp ON emp(empno); +CREATE unique index unique_emp1 on emp(ename); +-- 2.查询emp表有哪些索引 +show index from emp; +-- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 +explain SELECT * FROM emp WHERE ename ='诸葛亮'; +-- 4. 删除前面建立的两个索引 +drop index index_emp on emp; +DROP index unique_emp1 on emp; +-- 5. 选择两个字段添加一个复合索引 +CREATE index index_tow on emp(empno,ename); +-- 6. 使用复合索引的字段进行查询 +SELECT * FROM emp WHERE ename='诸葛亮' and job = '分析师'; +-- 作业 +-- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 +CREATE TABLE tab_random( + id int primary key auto_increment , + uname varchar(255), + age int +); +drop procedure if exists pro_random; +delimiter // +create procedure pro_random() +begin +declare i int default 0; +while i < 5000000 do +insert into tab_random(uname,age) +values(floor(rand()*500000),floor(rand()*100)); +set i = i+1; +end while; +end// +delimiter; +call pro_random(); +-- 1. 不用索引查询 一次姓名uname /并记录时间 + +-- 2. 建立索引查询 一次姓名uname /并记录时间 +``` + +-- 1. 不用索引查询 一次姓名uname /并记录时间 + +![1729436262833](C:\Users\lenovo\Desktop\1729436262833.jpg) + + + +-- 2. 建立索引查询 一次姓名uname /并记录时间 + +![1729436462065](C:\Users\lenovo\Desktop\1729436462065.jpg) \ No newline at end of file -- Gitee