diff --git "a/21 \345\215\242\344\272\250\350\200\200/\347\264\242\345\274\225.md" "b/21 \345\215\242\344\272\250\350\200\200/\347\264\242\345\274\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..0b51d7d21a588e909b0ac127e6365ad0a693983a --- /dev/null +++ "b/21 \345\215\242\344\272\250\350\200\200/\347\264\242\345\274\225.md" @@ -0,0 +1,121 @@ +## 索引 + +### 介绍 + + 索引是通过某种算法,构建出一个数据模型,用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到查出相关行(效率慢),如果表中查询的列有一个索引,MySQL能够根据索引快速的找到相关行(效率高),而不必查看所有数据,==节省大量时间==。但是==降低了增、删、改的速度==。 + +### 索引结构 + +#### Hash索引 + + 哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。 + +#### B+Tree索引 + + B+Tree 索引,是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。 数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。 + +![img](https://s2.loli.net/2023/10/19/DZnuYgyJkjVowG8.png) + +### 索引分类 + +| 分类 | 含义 | 特点 | 关键字 | +| ------------ | ------------------------------------ | ------------------------ | -------- | +| **主键索引** | 针对于表中主键创建的索引 | 默认自动创建,只能有一个 | PRIMARY | +| **唯一索引** | 避免同一个表中某数据列中的值重复 | 可以有多个 | UNIQUE | +| **常规索引** | 快速定位特定数据 | 可以有多个 | | +| **全文索引** | 查找文本中的关键词,不比较索引中的值 | 可以有多个 | FULLTEXT | + +### 索引语法 + +**创建索引: 建立索引时一定要指定索引名称** + +1. 在已存在表的中创建索引 + +``` +create index 索引名 on 表名(字段名) +``` + +1. 通过修改表方式赖添加索引 + +``` +alter table 表名 add index 索引名(字段名) +``` + +1. 创建表时直接指定索引 + +``` +create table emp( + id int primary key, # 创建主键会自动创建一个主键索引 + ename varchar(10), + index 索引名(字段) +); +``` + +**查看一张表有哪些索引** + +``` +show index from 表名; +``` + +**删除索引** + +``` +drop index 索引名 on 表名; +``` + +**删除主键索引** + +``` +alter table 表名 drop primary key; +``` + +**最左前缀法则** + +从左开始,左边的索引必须要存在,从左往右查 + +**explain 执行计划** + +``` +explain select * from emp; +``` + +**运行时间** + +![无标题2](https://s2.loli.net/2023/10/19/CRlfxQsuUGvV4kE.png)![无标题](https://s2.loli.net/2023/10/19/tqDJzhwLXy7kYUo.png) + +### 作业 + +```sql +create table person2( +id int auto_increment primary key, +`name` varchar(10) not null, +sex char(1), +tel char(11), +hobby text +); + +delimiter $$ +create procedure add_n() +BEGIN +declare i int default 1; +declare tel char(11) default '10000000000'; +REPEAT + + insert into person2 value(0,concat(substr(@first_name,floor(rand()*char_length(@first_name)+1),1),substr(@last_name1,floor(rand()*char_length(@last_name1)+1),1),substr(@last_name2,floor(rand()*char_length(@last_name2)+1),1)), + case floor(rand()*2) when 0 then '女' else '男' end, + tel, + case floor(rand()*4) when 0 then '听音乐' when 1 then '睡觉' when 2 then '打游戏' else '什么都不喜欢' end); + set i=i+1; + set tel=tel+1; +UNTIL i>10000000 END REPEAT; +end $$ +delimiter ; +set @first_name = '赵钱孙李周吴郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮卞齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闽席季麻强贾路娄危江童颜郭梅盛林刁锺徐丘骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经房裘缪干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁荀羊於惠甄麹家封芮羿储靳汲邴糜松井段富巫乌焦巴弓牧隗山谷车侯宓蓬全郗班仰秋仲伊宫宁仇栾暴甘斜厉戎祖武符刘景詹束龙叶幸司韶郜黎蓟薄印宿白怀蒲邰从鄂索咸籍赖卓蔺屠蒙池乔阴郁胥能苍双闻莘党翟谭贡劳逄姬申扶堵冉宰郦雍郤璩桑桂濮牛寿通边扈燕冀郏浦尚农温别庄晏柴瞿阎充慕连茹习宦艾鱼容向古易慎戈廖庾终暨居衡步都耿满弘匡国文寇广禄阙东欧殳沃利蔚越夔隆师巩厍聂晁勾敖融冷訾辛阚那简饶空曾毋沙乜养鞠须丰巢关蒯相查后荆红游竺权逑盖益桓公'; + +set @last_name1 = '伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛'; + +set @last_name2 = '菁梦岚苑婕馨瑗琰乐佳涵晋逸沅海圣姬泰诗韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育涵琴晴丽美瑶梦茜倩希夕月悦乐彤影珍依沫玉灵瑶嫣倩妍萱漩娅媛怡佩淇雨娜莹娟文芳莉雅芝文晨宇怡全子凡悦思奕亚宜可钊钧铎铭皑柏镇淇淳一洁茹清吉克先依浩泓亮允元源渊和函妤宜云琪菱宣沂健信媛凯伊欣可洋萍荣榕含佑明雄芝英义卿乾亦雅芝烨萱昊芸天岚昕尧鸿棋琳宸乔丞安毅凌惠珠舒泉坤恒渝菁龄弘佩勋宁栋嘉哲俊博维'; + +call add_n(); +``` +