当前位置: 首页 > news >正文

【SQL】MySQL中的索引,索引优化

索引是存储引擎用来快速查询记录的一种数据结构,按实现方式主要分为Hash索引B+树索引
按功能划分,主要有以下几类
在这里插入图片描述
单列索引指的是对某一列单独建立索引,一张表中可以有多个单列索引
1. 单列索引 - 普通索引

  • 创建索引(关键字index):
create table student(id int primary key,card_id varchar(20),name varchar(20),index index_name(name) -- 1.创建表时,给name列创建普通索引
);
-- 2.创建表后,添加普通索引
create index index_name on student(name); 
-- 3.修改表结构,添加普通索引
alter table student add index index_name(name);
  • 查看索引(通用操作):
show index from student;
  • 删除索引(通用操作,仅需修改索引名字):
drop index index_name on student;
-- 或
alter table student drop index index_name;

2. 单列索引 - 唯一索引
与普通索引的区别在于唯一索引列的值必须唯一,但可以有空值

  • 创建索引(关键字unique):
create table student(id int primary key,card_id varchar(20),name varchar(20),unique index_card_id(card_id) -- 1.创建表时,给card_id列创建唯一索引
);
-- 2.创建表后,添加唯一索引
create unique index index_card_id on student(card_id); 
-- 3.修改表结构,添加唯一索引
alter table student add unique index_card_id(card_id);

3. 单列索引 - 主键索引
MySQL会在主键列上自动创建索引,就是主键索引。(联合主键也会自动创建对应的组合索引)
主键列唯一且不为空,所以主键索引是特殊的唯一索引
4. 组合索引(复合索引)
组合索引指将多个列合在一起创建索引,可以创建组合普通索引,组合唯一索引(某一列值可以重复,但两列合起来不能重复)。

  • 创建组合索引
-- 添加组合普通索引
create index index_card_id on student(id,card_id); 
-- 添加组合唯一索引
create unique index index_card_id on student(id,card_id); 

组合索引的使用符合最左原则,例如上面的索引,单独查id可以用到组合索引,单独查card_id用不到组合索引。
5. 全文索引(仅了解)

  • 全文索引用来查找文本中的关键字,类似于like+%模糊匹配
  • 关键字为fulltext,在大量文本数据查找时,速度比like+%快N倍
  • 只有char、varchar、text及其系列才可以建全文索引
  • 全文索引有两个变量,最小搜索长度和最大搜索长度,只有长度在最小搜索长度~最大搜索长度的文本,才能被索引查询。
-- 添加组合普通索引
alter table t_article add fulltext index_content(content);
-- 添加组合唯一索引
create fulltext index index_content on t_article(content); 
  • 使用全文索引查询,使用match和against关键字,不能用like
-- match后跟字段,against后跟要模糊匹配的文本
select * from t_article where match(content) against('you');
-- 查询结果与下面语句相同
select * from t_article where content like '%you%';

6. 空间索引(使用很少,仅了解)
空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有以下4种

空间数据类型含义说明
Geometry空间数据任何一种空间类型
Point坐标值
LineString线一系列点连接而成
Polygon多边形多条线组成
  • 添加空间索引(关键字spatial)
create table shop_info(id int primary key auto_increment comment 'id',shop_name varchar(64) not null comment '门店名称',geom_point geometry not null comment '经纬度',spatial key geom_index(geom_point) -- 添加空间索引
);

索引内部原理

  • 索引通常以索引文件的形式存储在磁盘中
  • 索引查找要产生磁盘I/O消耗,而磁盘I/O的消耗远高于内存I/O,所以索引的数据结构要尽量减少磁盘I/O的操作次数
  • Hash索引
    通过字段值计算出hash值(可看作是存储地址,类似于书本中的页码),直接定位数据
    在这里插入图片描述
  • B+树索引
    二叉树 -> 平衡二叉树 -> B树 -> B+树
    二叉树
    在这里插入图片描述
    平衡二叉树
    在这里插入图片描述
    B树(B-Tree)
    PS:没有B减树,只有B树,英文就是B-Tree,-只是为了分隔B和Tree
    数据可视化网址https://www.cs.usfca.edu/~galles/visualization/BTree.html
    B+树
    数据可视化网址https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
    MyISAM存储引擎使用B+树作为索引结构,叶节点的data域存放的是数据的地址。
    InnoDB存储引擎使用B+树作为索引结构,叶节点的data域存放的是数据,比MyISAM效率高一点,但占磁盘空间。
http://www.lryc.cn/news/190895.html

相关文章:

  • uniapp 跳转到指定位置
  • 基于java的图书馆预约座位系统的设计与实现(部署+源码+LW)
  • golang 拉取 bitbucket.org 私有库
  • Sub-1G射频收发器soc芯片 UM2080F32 低功耗 32 位 IoTP
  • 国际减灾日 | 智慧减灾——百分点科技的数据科学视角
  • ChatGLM流式输出的报错修复
  • HDLbits: ece241 2013 q12 // Exams/m2014 q4k
  • vue3模板-vscode设置(语法糖)
  • RFID超高频读写器的特点和应用
  • 诡异事件:开发的安卓摄像头应用突然不能保存图片,回滚代码都查不出来
  • validator库的使用详解
  • ADS版图中连接提示线设置
  • 【MySQL】内置函数——数学函数+其他函数
  • Ubuntu 23.10 Beta 镜像开放下载
  • mybatispagehelp嵌套分页处理
  • 增速波动!W「下」AR「上」!HUD前装供应商比拼硬核能力
  • XXE漏洞复现实操
  • github创建个人网页登录后404无法显示的问题
  • MySQL——源码安装教程(初版)
  • 1.1.C++项目:仿muduo库实现并发服务器之any类的设计
  • linux项目启动脚本start.sh和stop.sh停止脚本
  • Avalonia常用小控件Svg
  • 设计模式-行为型模式
  • 【EventLoop】问题一次搞定
  • Unity中Shader光照模型Phong
  • 消息队列缓存,以蓝牙消息服务为例
  • MSF派生给另外MSF,meterpreter派生给另外meterpreter,Metasploit
  • 【LeetCode】1.两数之和
  • 3. Windows下C++/MFC调用hiredis库操作redis示例
  • 200、使用默认 Exchange 实现 P2P 消息 之 消息生产者(发送消息) 和 消息消费者(消费消息)