From 8e206fc1556d4d668ec211ec59605fc0d65a7755 Mon Sep 17 00:00:00 2001
From: unknown <2112572495@qq.com>
Date: Thu, 19 Oct 2023 13:23:12 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E5=8D=81=E4=B8=89=E6=AC=A1=E4=BD=9C?=
=?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../20231018 \347\264\242\345\274\225.md" | 174 ++++++++++++++++++
1 file changed, 174 insertions(+)
create mode 100644 "39 \351\203\255\346\202\246\350\277\216/20231018 \347\264\242\345\274\225.md"
diff --git "a/39 \351\203\255\346\202\246\350\277\216/20231018 \347\264\242\345\274\225.md" "b/39 \351\203\255\346\202\246\350\277\216/20231018 \347\264\242\345\274\225.md"
new file mode 100644
index 0000000..eb1e565
--- /dev/null
+++ "b/39 \351\203\255\346\202\246\350\277\216/20231018 \347\264\242\345\274\225.md"
@@ -0,0 +1,174 @@
+## 笔记
+
+### **索引** : (index)
+
+- 概念 :是帮助MySQL **高效获取数据** 的数据结构
+- 建立索引要花费对应的时间和硬盘空间
+
+### 索引的分类
+
+1. **单列索引** :一个索引建立在一个列上,一张表可以拥有多个单列索引
+
+ ```mysql
+ -- 单列索引分为
+ # 普通索引:单纯为了提高搜索效率index
+ # 唯一索引:unique index,唯一索引只能够建立在数据不重复的列上,唯一约束,不能重复,可以null,有多个唯一索引
+ # 主键索引:primary key唯一性,非空,主键约束
+ ```
+
+2. **联合索引** :可以同时为多个列创建一个索引
+
+3. **全文索引** :(了解)
+
+ps:使用索引时,索引列的值类型要匹配且被查询的值起点要明确
+
+```mysql
+# 创建普通索引
+1、 create index 索引名 on 表名(列名);
+2、通过修改表的方式来添加索引
+alter table 表名 add index 索引名(列名);
+3、在创建表的同时建立索引,手动建立索引一定要指定名称
+create table 表名(
+ aaa int primary key,
+ bbb varchar(20),
+ index 索引名 (列名) -- 以这种模式定义的索引,可以不指定索引名称。
+ primary key(列名)
+);
+```
+
+#### 查看表的索引
+
+```sql
+show index from 表名;
+```
+
+#### 删除索引
+
+```sql
+drop index 索引名 on 表名;
+```
+
+并且删除表时,会一并删除表上的全部索引。
+
+```sql
+alter table 表名 drop index 索引名;
+```
+
+#### 唯一索引:建立列的唯一约束时,会自动创建唯一的索引,索引名就是列名
+
+它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式
+
+```mysql
+create unique index 索引名 on 表名(列名); -- 创建普通索引的基础上。多了unique关键字
+```
+
+ 在已存在的表上追加唯一索引
+
+```mysql
+alter table 表名 add unique 索引名 (列名)
+```
+
+ 创建表的时候直接指定
+
+```mysql
+create table tc_9(
+ aaa int primary key,
+ bbb varchar(20),
+ unique [INDEX] 索引名 (列名) -- 唯一索引,一定有索引名,index 可以省略
+);
+
+-- 唯一索引和唯一约束 语法还是 有些区别
+create table tc_9(
+ aaa int primary key,
+ bbb varchar(20),
+ tel char(11), -- unique not null,
+ unique (tel) -- unique(列名) -- 约束是没有 索引名 和 index 关键字的
+);
+```
+
+**删除唯一索引的方法与删除普通索引相同。**
+
+#### 主键索引 与 index 关键字没有关系
+
+删除主键
+
+可以使用 ALTER 命令删除主键: index
+
+```sql
+alter table 表名 drop primary key;
+```
+
+删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。而不能使用删除普通索引的方法来删除主键索引。
+
+```sql
+-- 这都是错误的。
+drop index PRIMARY on tc_10;
+drop primary key on tc_10;
+```
+
+## 联合索引
+
+```sql
+create index 索引名 on 表名(列名1,列名2....) -- 普通的联合索引
+create unique index 索引名 on 表名(列名1,列名2....) -- 联合唯一索引
+```
+
+*执行原则:最左前缀法则
+
+## explain 执行计划
+
+可用于查看某个查询语句的执行详细情况
+
+语法:
+
+```sql
+explain select ... from ......
+```
+
+
+
+## 作业
+
+
+
+```mysql
+create database db_test charset utf8;
+use db_test;
+-- 建立一个数据和表(id,name,phone,sex,hobby),想办法插入10万条数据,
+create table a (
+ id int,
+ name varchar(10),
+ sex varchar(1),
+ phone varchar(11),
+ hobby varchar(20)
+ );
+
+# 创建存储过程
+drop procedure test01;
+delimiter //
+create procedure test01()
+begin
+ declare i int default 1;
+ repeat
+ set i=i+1;
+ insert into a (id,name,sex,phone,hobby) values (i,'完颜慧德','女','12356542365','安分守己');
+ until i =100000
+ end repeat ;
+end //
+delimiter ;
+call test01();
+
+-- 执行查询文件tb_user.sql,数据准备好了之后,完成如下需求:
+-- 1. name字段为姓名字段,该字段的值可能会重复,为该字段创建索引。
+create index idx_name on tb_user(name);
+-- 2. phone手机号字段的值,是非空,且唯一的,为该字段创建唯一索引。
+create unique index idx_phone on tb_user(phone);
+-- 3. 为profession、age、status创建联合索引。
+create index idx_pas on tb_user(profession,age,`status`);
+drop index idx_pas on tb_user;
+-- 4. 为email建立合适的索引来提升查询效率。
+create unique index idx_email on tb_user(email);
+-- 5. 查看tb_user表的所有的索引数据。
+show index from tb_user;
+```
+
--
Gitee