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 ...... +``` + + + +## 作业 + +![111.png](https://s2.loli.net/2023/10/19/b2fy5nLDTIYrtk9.png) + +```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