diff --git "a/55 \346\235\250\346\227\255\344\270\234/20231019\350\257\273\345\217\226.md" "b/55 \346\235\250\346\227\255\344\270\234/20231019\350\257\273\345\217\226.md" new file mode 100644 index 0000000000000000000000000000000000000000..82a9457952f35c12e6a44ae588ccae980169521c --- /dev/null +++ "b/55 \346\235\250\346\227\255\344\270\234/20231019\350\257\273\345\217\226.md" @@ -0,0 +1,165 @@ +~~~MySQL +笔记 + +```mysql +索引 +是对表的一列或者多列值进行排序的一种结构,可以大大提高MySQL的检索速度 + +但是创建索引和为维护索引需要耗费时间,这种时间回随着数据量的增加而增加,且需要额外占用物理空间 + +在对表的数据进行增删改时也要动态的维护,大大降低了整体的维护速度 + +创建的准则 +最好创建在经常搜索的列,主键列,连接列(外键),经常需要 根据范围 或者 排序 或者 where条件的列 + +不要创建在很少使用,很少数据或者数据高度重复的列,定义为text, image和bit数据类型的列,修改性能要求远远高于检索性能 + +索引类型 +主键索引(Primary Key Index):用于唯一标识表中的每一行数据。 +唯一索引(Unique Index):确保索引列中的值是唯一的。 +普通索引(Normal Index):基本的索引类型,没有唯一性约束。 +全文索引(Full-Text Index):用于全文搜索,支持对文本内容进行快速搜索。 +多列索引(Composite Index):由多个列组成的索引,用于优化多列查询的性能。 +空间索引(Spatial Index):用于支持地理位置数据的查询操作 * +创建格式 +create + +-- 单列普通索引 +create index 索引名 on 表(列名); +-- 所有类型通用索引 +create (unique)index 索引名 on 表(列名,多个用,隔开); +alter + +-- 单列普通索引 +alter table 表 add index 索引名 on 表(列名); +-- 所有类型通用索引 +alter table 表 add (unique)index 索引名 (列名,多个用,隔开); +建表时创建 + +CREATE TABLE table_name ( + a1 datatype, + a2 datatype, + ..., + (UNIQUE) INDEX 索引名 (a1, a2, ...) +) + +CREATE TABLE 表 ( + id int PRIMARY KEY, + b1 int, + b2 varchar(50), + ... + UNIQUE (b1), + +); +在这个表中因为给id添加了primary key 所以会自动添加一条id的主键约束 + +创建时若索引名省去,部分索引将会自动添加一个索引名 + +主键索引的补充 +严格来说不能算是索引,不能create,删除和添加的格式也和主键约束是一样的 + +效果就是在唯一约束的基础上加了一个非空 + +创建主键约束时默认创建一个主键索引 + +联合索引 +是由多个列组成的索引。与单列索引相比,联合索引可以在多列查询中提高查询性能。 + +创建联合索引时,需要根据实际情况选择适当的列,并考虑查询的频率和关联性。如果一个表中有多个常用的查询操作,可以创建多个不同的联合索引来满足不同的查询需求。 + +需要注意的是,创建联合索引时需要考虑列的顺序(遵循最左原则)。一般来说,应该将使用频率较高的列放在前面,这样可以减少索引的扫描次数,并提高查询效率。 + +最左原则 +创建联合索引后调用该索引时必须带上创建该索引时最左的那个字段,并且不能跳过中间的字段 + +如果select中where是 XX and YY 且 XX 和 YY 有联合索引,则只要有该索引的最左条件即可调用 + +explain +查看select的执行计划过程 + +explain select语句 +在这里插入图片描述 + +索引失效 +索引列运算 字符串不加引号 + +模糊查询没有固定界就不能调用 + +必须 like'X...' or like'...X' +or + +如果or前面字段有索引后面字段没有也不会调用索引 + +数据分布影响(如果直接跑比索引开优先直接跑) + +ues/ignore/force +ues/ignore/force index 建议/忽略/强制 使用索引 + + +``` + +```mysql +CREATE DATABASE text charset utf8; +USE text; + +CREATE TABLE worker( + id INT PRIMARY KEY auto_increment, + `name` VARCHAR(3) NOT NULL +); + + + +delimiter $$ +CREATE PROCEDURE mil_pro() +BEGIN + DECLARE `name` CHAR(3); + DECLARE i INT DEFAULT(0); + + WHILE i<100000 DO + SELECT CONCAT( + SUBSTRING('赵钱孙李周吴郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方',RAND()*32+1,1), + SUBSTRING('伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博',RAND()*70+1,1), + SUBSTRING('伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博',RAND()*70+1,1) + ) INTO `name`; + INSERT INTO worker VALUES (NULL,`name`); + SET i=i+1; +END WHILE; + +END$$ +delimiter ; + +CALL mil_pro(); + + +SELECT * FROM worker WHERE id=800; + +-- 创建索引 +create unique index ind_id on worker(id); + +-- 调用 +select * from worker; + +-- 查看select的执行计划过程 +EXPLAIN select id from worker; +create database Ok; +create database school charset utf8; +use school; +create table stu( + id int primary key auto_increment, + name varchar(12), + phone char(11) +); +delimiter // +create procedure a(in x int) +begin + declare i int default 0; + while i