diff --git "a/49 \346\235\216\350\210\222\346\261\266/10.17\345\244\215\344\271\240.md" "b/49 \346\235\216\350\210\222\346\261\266/10.17\345\244\215\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..19af2f0fc158e830a7c87f3f578395a055fbc188 --- /dev/null +++ "b/49 \346\235\216\350\210\222\346\261\266/10.17\345\244\215\344\271\240.md" @@ -0,0 +1,12 @@ +## 补充 + +### timestampdiff(单位,a,b) + +```sql +单位:year、month、day、hour、minute、second、miscrosecond +a为下 +b为大 +向下取整,满24小时为一天 +``` + + diff --git "a/49 \346\235\216\350\210\222\346\261\266/10.18\347\264\242\345\274\225.md" "b/49 \346\235\216\350\210\222\346\261\266/10.18\347\264\242\345\274\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..43f7d57c3abcb6166b749d8f8ecdeaf3e866484d --- /dev/null +++ "b/49 \346\235\216\350\210\222\346\261\266/10.18\347\264\242\345\274\225.md" @@ -0,0 +1,210 @@ +### 索引的优点* 提升select 速度 90% + +提高数据检索的效率,**降低数据库的IO成本**,**降低CPU的消耗** + +#### 缺点(忽略不计): 降低了 INSERT、UPDATE、DELETE 速度 + +索引列也是要占用空间的。索引大大提高了查询效率,同时却也降低更新表的速度, + +如对表进行INSERT、UPDATE、DELETE时,需要对索引进行维护,效率降低。 + +## 索引的分类 + +单列索引:一个索引建立在一个列上,一张表可以拥有多个单列索引 + +* 普通索引:单纯地为了提高搜索效率 index +* 唯一索引:unique index,唯一索引只能够建立在数据不重复的列上 ,唯一约束 ,不能重复,可以null,有多个唯一索引 +* 主键索引:primary key唯一性、非空,主键约束 ,不能重复,也不能null,一个只能有一个主键 + +联合索引:可以同时为多个列创建一个索引 + +## 单列索引 + +创建索引(普通索引) + +这是最基本的索引,它没有任何限制。它有以下几种创建方式: + +-- 方式一和二是给现成表加索引 + +方式一:直接在已有表中创建索引 + create index 索引名 on 表名(列名) -- 直接删除索引 drop index 索引名 on 表名; 这种不能用来创建主键索引 + +方式二:修改表结构追加普通索引 + alter table 表名 add index 索引名(列名); -- 修改表结构删除索引 alter table 表名 drop index 索引名; + +方式三:创建表的时候直接指定 + create table 表名( + aaa int primary key, + bbb varchar(20), + index 索引名 (列名) -- 以这种模式定义的索引,可以不指定索引名称。 + primary key(列名) + ); + +#### 查看表的索引 + + show index from 表名; + +可以查看到创建在表上的所有索引名称。 + +#### 删除索引 + + drop index 索引名 on 表名; + +并且删除表时,会一并删除表上的全部索引。 + alter table 表名 drop index 索引名; + +#### 唯一索引:建立列的唯一约束时,会自动创建唯一的索引,索引名就是列名 + + create unique index 索引名 on 表名(列名); -- 创建普通索引的基础上。多了unique关键字 + +​ 在已存在的表上追加唯一索引 + alter table 表名 add unique 索引名 (列名) + +​ 创建表的时候直接指定 + 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 关键字没有关系 + +创建主键索引,就是创建主键约束 + drop table if exists tc_10; + create table tc_10( + aaa int primary key, + bbb varchar(20), + ccc datetime + ); + create table tc_10( + aaa int, + bbb varchar(20), + ccc datetime, + primary key(aaa) + ); + create table tc_10( + aaa int, + bbb varchar(20), + ccc datetime + ); + alter table tc_10 add primary key(aaa); + +删除主键 + +可以使用 ALTER 命令删除主键: index + alter table 表名 drop primary key; + +删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。而不能使用删除普通索引的方法来删除主键索引。 + -- 这都是错误的。 + drop index PRIMARY on tc_10; + drop primary key on tc_10; + +## 联合索引 + + create index 索引名 on 表名(列名1,列名2....) -- 普通的联合索引 + create unique index 索引名 on 表名(列名1,列名2....) -- 联合唯一索引 + +*执行原则:最左前缀法则 + +删除全文索引,与删除普通索引一致。 + drop index index_content on t_article; + +explain 执行计划 + +可用于查看某个查询语句的执行详细情况 + +语法: + explain select ... from ...... + +Explain 执行计划中各个字段的含义: + +| 字段 | 含义 | +| ------------ | ----------------------------------------------------------------------------------------------------------------------------- | +| id | select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)。 | +| select_type | 表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或者后面的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)等 | +| type | 表示连接类型,性能由好到差的连接类型为NULL、system、const、eq_ref、ref、range、 index、all | +| possible_key | 显示可能应用在这张表上的索引,一个或多个 | +| key | 实际使用的索引,如果为NULL,则没有使用索引 | +| key_len | 表示索引中使用的字节数, 该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好 | +| rows | MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的 | +| filtered | 表示返回结果的行数占需读取行数的百分比, filtered 的值越大越好 | + +## 索引的使用 + +#### 最左前缀法则(联合索引) + +如果使用了联合索引,要遵守最左前缀法则。 + +最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,后面的字段索引失效。 + +### 作业 + +```sql +CREATE DATABASE sy charset utf8; +USE sy;-- 建立一个数据和表(id,name,phone,sex,hobby),想办法插入10万条数据, +CREATE TABLE suj ( + id INT, + NAME VARCHAR ( 20 ), + phone CHAR ( 11 ), + sex CHAR ( 1 ), + hobby VARCHAR ( 20 ), + profession VARCHAR ( 20 ), + age INT, + STATUS VARCHAR ( 20 ), +email VARCHAR ( 30 )); + +drop database if exists d; +create database if not exists d; +use d; + +set global sync_binlog=0; +set global innodb_flush_log_at_trx_commit=0; + +delimiter // +create procedure p_1(in num int) +BEGIN + declare i int default 1; + declare sex char(1) default '男'; + declare hobby char(10) default '唱'; + drop table if exists suj; + create table if not exists suj( + id int primary key auto_increment, + `name` varchar(30), + phone char(20), + sex char(1), + hobby char(10) + ); + while i<=num + DO + insert into suj values (null, CONCAT('张三', i),concat('28564',i),sex,hobby); + set sex='女'; + set hobby='唱'; + set i =i+1; + insert into suj values (null, CONCAT('李四', i),concat('78945',i),sex,hobby); + set sex='男'; + set hobby='打球'; + set i =i+1; + insert into suj values (null, CONCAT('王五', i),concat('25564',i),sex,hobby); + set sex='女'; + set hobby='music'; + set i =i+1; + set sex='男'; + end while; +end // +delimiter ; + +call p_1(10000000); +``` + +### 作业截图 + +![2151d9dc-f4ca-4f45-9a4b-544c2523bacd](file:///C:/Users/user/Pictures/Typedown/2151d9dc-f4ca-4f45-9a4b-544c2523bacd.png)