首页 > 数据库 >MySQL索引

MySQL索引

时间:2024-09-23 15:48:38浏览次数:9  
标签:name int t1 索引 MySQL table id

一.索引是什么

MySQL 索引是一种数据结构,用于加快数据库查询的速度和性能。大家可以自己试一下有索引和没索引的区别,两者的速度都不是在一个量级上。索引是极大的加快查询数据库的速度。

当然,索引这么快也是有代价的,创建索引后会生成索引树,它是占磁盘空间的。磁盘IO是很耗时间的,因此我们在创建索引的时候也要注意,在某系特定情况下索引不是最优解。

二.索引的底层

1.索引底层的数据结构

索引底层选择的是B+树。B+树的B树的一个变种,在B树的基础上在叶子节点增加了一个链指针,并且非叶子节点也不存储值了,只起到指向的作用,所有的值都存储在叶子节点上。

1.1 为什么要选择B+树?

因为其可有效的的控制树高,并且在相同树高的情况下,B+树查找任意元素的时间复杂度都是一样的,性能均衡。

1.2 为什么不选其他的数据结构

其他数据结构比如说:哈希和二叉搜索树。哈希的时间复杂度是很优秀的,可以达到 O(1) 的级别,但是不支持范围查找。二叉搜索树支持范围查找,但是无法控制树高,在最坏的情况下就成了一个单链表了,时间复杂度是 O(N) 的。由于数据库的数据都是存在硬盘上的,每访问一次节点都会发生磁盘IO,这导致数据库的性能下降,也不合适。

综上,B+比较符合我们的需求。

2.页

页(Pages)是 InnoDB 中管理数据的最小单元,是内存与磁盘交互的最小单元,默认大小是16KB。InnoDB是MySQL中的存储引擎。不管有没有数据,都会开一个页。

MySQL中的页有很多种类型,这里主要说索引页(数据页)。

3.B+树的应用

非叶子节点全部都是索引页,索引页保存主键的值和子节点的引用。叶子节点是数据页,存储的是具体的数据,页与页之间通过页号连接。

三.索引分类

1.主键索引

当表中定义一个主键时,会自动创建一个主键索引,索引的值是主键列的值。如果一个表没有定义主键,我们可以添加一个自增列,因为索引可以大幅提高查询速度,诱惑很大。

下面时创建方法:

# 方法一:
create table t1(
  id int primary key auto_increment,
  name varchar(32)
);

# 方法二:
create table t1(
  id int,
  name varchar(32),
  primary key(id)
);

# 方法三:
create table t1(
  id,int,
  name varchar(32)
);
alter table t1 add primary key(id);
alter table t1 modify id int auto_increment;

2.普通索引

最基本的索引类型,没有唯一性限制。可为多列创建组合索引,称为复合索引。

下面时创建方法:

# 方法一:
create table t1(
  id int,
  name varchar(32),
  index(id)
);

# 方法二:
create table t1(
  id int,
  name varchar(32)
);
alter table t1 add index(id);

# 方法三:可对索引命名,替换index_name
create table t1(
  id,int,
  name varchar(32)
);
create index index_name on t1(id);

复合索引的创建与普通索引相似,只是多了几列而已:
 

# 方法一:
create table t1(
  id int,
  name varchar(32),
  class_id int,
  index(id,class_id)
);

# 方法二:
create table t1(
  id int,
  name varchar(32),
  class_id int
);
alter table t1 add index(id,class_id);

# 方法三:可对索引命名,替换index_name
create table t1(
  id,int,
  name varchar(32)
);
create index index_name on t1(id,class_id);

3.唯一索引

当表上定义一个unique时,自动创建唯一索引。这个与唯一约束相似,比较好理解。

唯一索引的创建与主键索引相似:

# 方法一:
create table t1(
  id int primary key auto_increment,
  name varchar(32)
);

# 方法二:
create table t1(
  id int,
  name varchar(32),
  unique(id)
);

# 方法三:
create table t1(
  id,int,
  name varchar(32)
);
alter table t1 add unique(id);

4.全文索引

基于文本列上创建,以加快对这些列的查询操作。用于全文搜索,仅MyISAM和InnoDB引擎支持。

5.聚集索引

如果没有为表定义 primary key, InnoDB使用第⼀个 unique 和 not null 的列作为聚集索引。如果表中没有 primary key 或合适的unique 索引,InnoDB会为新插入的行生成⼀个行号并用6字节的 ROW_ID 字段记录, ROW_ID 单调递增,并使用 ROW_ID 做为索引。

6.非聚集索引

InnoDB使用这个主键值来搜索聚集索引中的行,这个过程称为回表查询。

7.数据覆盖

当⼀个select语句使用了普通索引且查询列表中的列刚好是创建普通索引时的所有或部分列,这时
就可以直接返回数据,而不用回表查询,这样的现象称为索引覆盖。

四.查看索引

一共有三种方法。

方法一:

show keys from t1;

查看的结果是这样的:

方法二:

desc t1;

查看的结果是这样的:

方法三:

show index from t1;

查看的结果是这样的:

如果我们给name添加一个普通索引,那么就会查出下列的结果:

五.删除索引

1.主键索引的删除

直接使用alter table t1 drop primary key;会报错,显示让我们先把自增给删掉。

那我们就先把自增删掉:

alter table t1 modify id int;

然后再删除就可以了:

alter table t1 drop primary key;

2.其他索引的删除

其他索引的删除比较简单,直接删除即可。

alter table 表名 drop index 索引名;

标签:name,int,t1,索引,MySQL,table,id
From: https://blog.csdn.net/lllsure/article/details/142423031

相关文章

  • 【PLW003】设备器材云端管理平台v1.0(SpringBoot+Mybatis+NodeJS+MySQL前后端分离)
    设备器材云端管理平台是一种专为各种设备(如教育行业中的实验设备、建筑行业中的施工设备等)租赁或共享孵化的数字化管理工具,旨在融合数字化手段,提高各种设备器材的管理效率、确保设备的安全稳定运行,并优化资源使用及配置效率。随着高新技术的不断发展和应用(如大数据、人工智能等新......
  • 服务器数据库mysql error错误怎么解决
    解决MySQL错误通常需要根据具体的错误信息来定位问题并采取相应的措施。下面是一些常见的解决步骤,可以帮助你处理服务器数据库中的MySQL错误:查看错误日志:检查MySQL的错误日志文件,通常位于/var/log/mysql/error.log(Linux)或C:\ProgramData\MySQL\MySQLServer5.7\data\error.l......
  • 《深入浅出MySQL 数据库开发、优化与管理维护》第3版 阅读笔记
    第9章索引的设计和使用9.6索引在MySQL8.0中的改进不可见索引索引默认是可见的,可以在创建表时增加invisible关键字来创建不可见索引createtablet1(iint,jint,indexi_idx(i)invisiable)engine=InnoDB;createindexi_idxont1(i)invisiable;altertablet1ad......
  • EC2机器上MySQL8 修改关闭binlog以及修改保存时间
    从库清空binlog因为MySQL8.0要修改配置文件,在mysqld下面增加skip-log-bin,且需要重启,所以换种思路直接将其设置为3分钟。##单位秒setglobalbinlog_expire_logs_seconds=180;##flushlogs;showbinarylogs;##清理日志,别一下全删完了,删到倒数第二个purgebinarylogs......
  • 初始MYSQL数据库(6)—— 事务
    找往期文章包括但不限于本期文章中不懂的知识点:个人主页:我要学编程(ಥ_ಥ)-CSDN博客所属专栏: MYSQL目录事务的概念 事务的ACID特性使用事务查看支持事务的存储引擎 事务的语法 保存点 自动/手动提交事务事务的隔离性和隔离级别事务的概念 首先,得了解什......
  • MYSQL--SQL语言
    SQL--操作关系型数据库语言在cmd中输入netstop/startmysql80来启用/关闭MySQL.在cmd中输入mysql-h127.0.0.1-P3306-uroot-p来连接到MySQL客户端,或者直接打开MySQL的客户端终端.关系型数据库使用表结构储存数据,使用统一的sql语言.SQL的通用语法1.sql语句可以多......
  • 医院急诊系统设计与实现spring boot+vue+mysql+html
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、其他案例七、源码获取​​​​​​​作者介绍:✌️大厂全栈码农|毕设实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️作者博客:曾几何时​​​​​​​......
  • 开源MySQL 数据库闪回工具:MyFlash数据恢复工具的安装及使用示例
    MyFlash是一个由美团点评开源的MySQL数据库闪回工具,它专门用于回滚MySQL中的DML操作,如INSERT、UPDATE和DELETE。这个工具通过解析MySQL的binlog文件来实现数据的恢复。使用MyFlash前,需要确保MySQL的binlog格式设置为ROW,并且binlog_row_image设置为FULL。以......
  • MySQL binlog解析工具binlog2sql使用示例
    binlog2sql是一个用于解析MySQL的二进制日志(Binlog)的工具,它可以将Binlog事件转换为SQL语句,这对于审计、数据同步等场景非常有用。binlog2sql通常用于实现MySQL数据的实时同步到其他数据库或系统中。安装binlog2sql首先,你需要安装binlog2sql。如果你使用的是Python环......
  • myflash MySQL数据恢复工具的使用示例:误删除数据恢复和误修改数据恢复两种场景
    以下是myflash数据恢复工具的使用示例,分为误删除数据恢复和误修改数据恢复两种情况:误删除数据恢复:构建测试环境:创建测试数据库和表。假设你已经安装并启动了MySQL服务,登录到MySQL客户端,执行以下语句创建一个名为testdb的数据库和一个名为user的表:sqlCREATEDATABASEtest......