MySQL中的索引创建及应用

 更新时间:2026年01月22日 16:17:55   作者:极客编程坊  
文章介绍了MySQL中索引的概念、用途、弊端、应用场景以及创建、删除索引的方法,还详细讲解了索引的分类,包括逻辑应用维度、物理存储维度和数据存储结构维度,最后,文章还分析了MySQL中索引的存储结构,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

MySQL中的索引应用

索引的定义

  • 什么是索引(Index)?

官方的定义索引是一种数据结构,从生活维度讲,假如将一本书看成是一张表,这本书的目录就是表中的索引.

  • 为什么要使用索引(Index)

数据量比较大时,为了快速找到们需要的数据可以使用索引,这样可以提高查询的效率.

  • 索引(Index)有什么弊端?
  1. 会额外的占用空间
  2. 对更新操作会带来一定的复杂度.
  • 使用索引(Index)的应用场景?
  1. on 子句
  2. where 子句
  3. group by 子句
  4. having 子句
  5. order by 子句

索引的分类

  • 逻辑应用维度 (主键,普通,联合,唯一,空间索引,…)
  • 物理存储维度 (聚簇索引,非聚簇索引)
  • 数据存储结构维度(hash,B+树,…)

索引创建及应用

  • 如何查看表中的索引?

show index from student;

  • 如何创建索引?
  1. 创建表的同时创建索引.(例如 create table tablename(…,index 索引名 (字段名)))
  2. 创建表后通过create语句创建索引(例如 create index 索引名 on 表名(字段名))
  3. 创建表后通过alter语句创建索引(例如 alter table add index 索引名(字段名))
  • 创建普通索引案例分享.
create index index_first_name on student(first_name);
alter table student add index index_last_name (last_name);
  • 创建唯一索引案例分享
create unique index index_first_name on student(first_name);
alter student add unique index index_first_name (last_name)
  • 创建组合索引案例分享
create index index_first_last on student(first_name,last_name);
alter table student add index index_first_last (first_name,last_name);
  • 如何删除索引?

drop index 索引名 on 表名;

例如

drop index index_first_last on student;

索引存储结构分析

  • MySQL中索引支持哪些存储结果?
  • hash,B+树,…
  • MySQL中InnoDB默认的索引存储结构是什么?
  • B+树
  • MySQL中的B+树有什么特点?
  1. 树中的非叶子节点只存储索引和指针
  2. 树中的叶子节点存储索引和数据
  3. 树中的叶子节点处于相同层,并且之间会使用双向链表连接,可以更好的支持范围查询.

  • MySQL中B+树相对于B树有什么优点?
  1. 一个磁盘可以存储索引数量会更多.
  2. 相同数据量的B+树相对于B树的高度相对会比较低(因为分叉多了)
  3. 叶子节点之间B+树有双向链表的连接,可以支持快速的范围查询.
  • 你觉得Hash索引有什么优势和劣势?
  • hash索引查询效率比较高,但是不支持范围查询.

聚簇索引和非聚簇索引

  • 什么是聚簇索引?

聚簇索引也叫聚集索引,索引和数据存储在一起,也就是索引与数据是不分离。
InnoDB存储引擎就是聚簇索引。

  • 聚簇索引都有哪些类型?

InnoDB中,一张表只有一个聚集索引(即主键索引),其他索引都是二级索引。
在实际应用中我们可以直接通过主键聚集索引查询到具体记录。假如是二级索引,这个
索引中存储是索引以及对应主键,我们使用二级索引执行查询时,是先基于二级索引找
到主键,再基于主键去查询具体记录(这个过程是回表查询)。

select first_name,salary
from employees
where employee_id=206

create index index_hire_date on employees(hire_date);
select first_name,salary,email
from employees
where hire_date='1987-07-09'

create index index_hire_date_salary on employees(hire_date,salary);
select first_name,salary,email
from employees
where hire_date='1987-07-09' and salary<8000
  • 什么是非聚簇索引?
    非聚簇索引是索引与数据是分离的,索引和数据是单独存储的。MyISAM存储引擎是非聚簇索引。

例如:

[10,0x1001] 0x1001表示记录地址
[12,0x1002]
0x1001 [10,Jack,J@t.com]
0x1002 [12,Mike,M@t.com]
  • 非聚簇索引存储的是什么?

非聚簇索引在创建时,存储的是索引值以及索引对应的记录的地址。
基于非聚簇索引查询数据时,可以先基于索引找到数据的一个地址,然后基于地址再去查找数据。
单从索引角度来说,非聚集索引查找速度不如聚集索引,非聚集索引找到索引位置后还需要根据索引找到数据对应的位置

到此这篇关于MySQL中的索引创建及应用的文章就介绍到这了,更多相关mysql索引应用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入谈谈MySQL中的自增主键

    深入谈谈MySQL中的自增主键

    这篇文章主要给大家介绍了关于MySQL中自增主键的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • mysql中in操作符的用法详解

    mysql中in操作符的用法详解

    IN 是 MySQL 中用于多值筛选的高效操作符,常用于 WHERE 子句,可替代多个 OR 条件,简化查询逻辑并提升可读性,这篇文章主要介绍了mysql中in操作符的用法详解,需要的朋友可以参考下
    2025-07-07
  • Mysql之索引长度限制方式

    Mysql之索引长度限制方式

    这篇文章主要介绍了Mysql之索引长度限制方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • CentOS 5.5下安装MySQL 5.5全过程分享

    CentOS 5.5下安装MySQL 5.5全过程分享

    网络上有很多相关的安装笔记,但是并不详尽,或是编译环境稍有不同,过程就会有差异,所以我总结了已有的经验和我自己安装过程中的体验,扩充并详尽地记录了整个过程。我选择安装的是MySQL5.5.27版本。以下是我的安装笔记
    2012-09-09
  • MySQL不使用子查询的原因及优化案例

    MySQL不使用子查询的原因及优化案例

    对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家详细介绍了MySQL不使用子查询的原因及优化案例,需要的朋友可以参考下
    2025-01-01
  • MySQL联合索引功能与用法实例分析

    MySQL联合索引功能与用法实例分析

    这篇文章主要介绍了MySQL联合索引功能与用法,结合具体实例形式分析了联合索引的概念、功能、具体使用方法与相关注意事项,需要的朋友可以参考下
    2017-09-09
  • MySQL使用触发器如何实现CHECK检查约束的功能

    MySQL使用触发器如何实现CHECK检查约束的功能

    这篇文章主要介绍了MySQL使用触发器如何实现CHECK检查约束的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • MySQL如何查看数据库连接数

    MySQL如何查看数据库连接数

    本文介绍了在MySQL中查看数据库连接数的多种方法,包括使用SHOWSTATUS命令、查询information_schema数据库、使用SHOWPROCESSLIST命令、查看最大连接数以及使用性能模式,每个方法都有详细的示例和注意事项,帮助你有效地监控和管理数据库连接
    2024-11-11
  • MySQL报错:Starting MySQL ERROR! Couldn‘t find MySQL server (/usr/local/mysql/bin/mysqld_safe)

    MySQL报错:Starting MySQL ERROR! Couldn‘t f

    本文主要介绍了MySQL报错:Starting MySQL ERROR! Couldn‘t find MySQL server (/usr/local/mysql/bin/mysqld_safe)
    2024-03-03
  • Mysql动态更新数据库脚本的示例讲解

    Mysql动态更新数据库脚本的示例讲解

    今天小编就为大家分享一篇关于Mysql动态更新数据库脚本的示例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论