广告
返回顶部
首页 > 资讯 > 数据库 >MySQL基础(六)-索引(index)详解
  • 704
分享到

MySQL基础(六)-索引(index)详解

sql数据库 2023-09-01 11:09:30 704人浏览 泡泡鱼
摘要

目录 一、什么是索引? 二、索引的实现原理 三、在MySQL中,主键、unique字段上会自动添加索引。 四、索引的创建与删除 创建索引: 删除索引: 五、查看SQL语句是否使用了索引 六、索引的失效 失效的第一种情况:模糊匹配当中以“%”

目录

一、什么是索引?

二、索引的实现原理

三、在MySQL中,主键、unique字段上会自动添加索引。

四、索引的创建与删除

创建索引:

删除索引:

五、查看SQL语句是否使用了索引

六、索引的失效

失效的第一种情况:模糊匹配当中以“%”开头

失效的第二种情况:使用or

失效的第三种情况:使用复合索引时,没有使用左侧的列查找

失效的第四种情况:在where当中索引列列添加了运算

失效的第五种情况:在where中,索引列使用了函数

七、索引的分类


一、什么是索引

索引实在数据库表的字段上添加的,是为了提高查询效率存在的一种数据结构

一张表的一个字段可以添加一个索引,当然,多个字段也可以联合起来添加索引。

索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。

比如我们通过字典查找某个汉字的时候,有两种方法:

第一种方法:

        一页一页找,知道找到我们需要的内容为止。这种查找方式属于全字典扫描,效率比较低。

第二种方法:

        先通过目录(索引)去定位一个大概的位置,然后直接定位到这个位置,做局域性扫描,缩小扫描的范围,快速的查找。这种查找方式属于通过索引检索,效率较高。

如:

         因为添加了查询条件"name=jack",所以我们会去name字段上扫描。

        如果name字段上没有添加索引(目录),或者说没有给name字段创建索引,Mysql会进行全扫描。会将name字段上的每一个值都比对一遍,效率较低。

mysql在查询方面主要就是两种方式:

        第一种方式:全表扫描

        第二种方式:根据索引检索

注意:

        在实际中,字典的目录是排序的,按照 a b c ....进行排序。因为只有排序了才有区间查找的概念。缩小扫描范围实际就是扫描某个区间。

        在Mysql数据库中索引也是需要索引的,并且这个索引的排序和TreeSet数据结构相同。在MySQL中索引是一个B-Tree数据结构

        遵循左小右大原则存放,采用中序遍历方式遍历取数据。

二、索引的实现原理

注意1:在任何数据库当中,主键上都会自动添加索引对象。另外在MySQL中,一个字段上如果有unique约束的话,也会自动创建按索引对象。

注意2:在任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。

注意3:在MySQL中,索引是一个单独的对象。不同的存储引擎以不同的形式存在。但不过关索引存储在哪里,索引在MySQL中都是以一个树的形式存在(自平衡二叉树:B-Tree)

二叉树数据结构的弊端:

        当极端情况下,数据递增插入时,会一直向右插入,形成链表,查询效率会降低。

MySQL中常用的索引数据结构有:

  • BTree索引(Myisam普通索引)
  • B+Tree索引(InnoDB普通索引)
  • Hash索引(memory存储引擎)等等
储存引擎存储位置
MyISAM.MYI
InnoDBtablespace
MEMORY内存

索引的实现原理:缩小扫描范围,避免全表扫描。

索引的优势:

        提高数据检索的效率,降低数据库的io成本。

        通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

索引的劣势:

        索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的。

        再索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,MySQL不仅要更新数据,还需要保存一下索引文件。每次更新添加了索引列的字段,都会区调整因为更新带来的简直变化后的索引的信息。

三、索引的使用场景

在MySQL中,主键、unique字段上会自动添加索引。

在什么条件下,我们会考虑给字段添加索引呢?

条件1:数据量庞大

条件2:该字段经常出现在where的后面,以条件的形式存在。即这个字段总是被扫描。

条件3:该字段很少的DML操作。因为DML之后索引需要重新排序

建议不要随意添加索引,因为索引也是需要维护的。太多的话反而会降低系统的性能。

建议通过主键查询,通过unique约束的字段进行查询,效率较高。

不推荐建立索引:

表记录太少

经常增删改的表

where条件里用不到的字段不建立索引

四、索引的创建与删除

创建索引:

给emp表的ename字段添加索引,起名:emp_ename_index

create index emp_ename_index on emp(ename);alter table emp add index emp_ename_index(ename);

删除索引:

将emp表上的emp_ename_index索引对象删除

drop index emp_ename_index on emp;

五、查看SQL语句是否使用了索引 - explain

使用explain关键字可以用来分析查询语句或者表的结构的性能瓶颈。其作用:

  1. 表的读取顺序
  2. 哪些索引可以使用
  3. 数据读取操作的操作类型
  4. 哪些索引被实际使用
  5. 表之间的引用
  6. 每张表有多少行被优化器查询
mysql> explain select * from test where id=1;+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+|  1 | SIMPLE      | test  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    7 |    14.29 | Using where |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+1 row in set, 1 warning (0.00 sec)# 给id字段添加索引mysql> create index id_index on test(id);Query OK, 0 rows affected (0.08 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> explain select * from test where id=1;+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key      | key_len | ref   | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+|  1 | SIMPLE      | test  | NULL       | ref  | id_index      | id_index | 5       | const |    4 |   100.00 | NULL  |+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+1 row in set, 1 warning (0.00 sec)

 扫描7条记录,说明没有使用索引。

type=ALL:未使用索引

type=ref:使用索引

explain重要字段名

id:

select查询的序列号,表示查询中执行select子句或操作表的顺序。

  • id相同时,执行顺序由上至下。
  • id不同,如果是子查询,id序号会递增,id值越大优先级越高,则越先被执行。
  • id相同和不同都存在时,id相同的可以理解为一组,从上往下顺序执行。所有组中,id值越大,优先级越高越先执行。

select_type:

查询的类型,常见值有如下,

  • simple:简单的select查询,查询中不包括子查询或者uNIOn。
  • primary:查询中若包含任何复杂的子部分,最外层查询则被标记为primary
  • derived:在from列表中包含的子查询被标记为derived(衍生),MySQL会递归执行这些子查询,把结果放在临时表里。
  • subquery:在selectwhere列表中包含了子查询。

table:

显示这一行的数据是关于哪张表的。

type:

访问类型排序。最好到最差依次是system>const>eq_ref>ref>range>index>all

  • System:表只有一行记录(等于系统表)是const的特例,可以忽略不计。
  • Const:通过索引一次就找到了,用于比较primary key或unique索引。因为只匹配一行数据,所以很快。
  • eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
  • Ref:非唯一性索引扫描,返回匹配某个单独值的所有行。
  • range:只检索给定范围的行,使用一个索引来选择行。
  • index:full index scan。index与all的区别:index类型只遍历索引树。通常比all快,因为索引文件通常比数据文件小。也就是说,虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘中读取的。
  • all:full table scan。将遍历全表一找到匹配的行。

possible——keys:

显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上如果存在索引,则该索引将会被列出来,但不一定会被查询实际使用上。

key:

查询中实际使用的索引,如果为null,则没有使用索引。

ref:

显示索引的哪一列被使用了。哪些列或常量被用于查找索引列上的值。

rows:

显示MySQL认为它执行查询时必须检查的行数。一般越少越好。

extra:

  • using filesort:MySQL无法利用索引完成的排序操作称为“文件排序”
  • using temporary:MySQL在对查询结果排序时使用品是表,常见于排序order by和分组查询group by
  • using index:表示索引被用来执行索引键值的查找,避免访问了表的数据行,效率不错。
  • using where:表示使用了where过滤。

六、索引的失效

失效的第一种情况:模糊匹配当中以“%”开头

select * from emp where ename like '%T';

在上述代码段中,ename上即使添加了索引,也不会进行索引。

原因是模糊匹配当中以“%”开头。所以尽量避免在模糊查询的时候以“%”开头,作为一种优化的手段/策略。

失效的第二种情况:使用or

如果使用or,那么要求or两边的条件字段都要有索引,才会进行索引。如果其中一边有一个字段有索引,另一个字段没有索引,那么另一个字段上的索引也会失效。

所以这就是不建议使用or的原因。

失效的第三种情况:使用复合索引时,没有使用左侧的列查找

复合索引的概念:

        两个字段,或者更多的字段联合起来添加一个索引,叫做复合索引。

如:

create index emp_job_sal_index on emp(job,sal);

失效的第四种情况:在where当中索引列列添加了运算

explain select * from emp where sal+1=800;

失效的第五种情况:在where中,索引列使用了函数

explain select * from emp where lower(ename)='smith';

七、索引的分类

索引是各种数据库进行优化的重要手段。优化的时候优先考虑的因素就是索引。

索引的分类:

单一索引:一个字段上添加索引。

复合索引:两个字段或者更多的字段上添加索引。

主键索引:主键上添加索引。

唯一性索引:具有unique约束的字段上添加索引。

......

注意:唯一性比较弱的字段上,添加索引用处不大。

八、排序优化

  1. 尽量避免使用using filesort方式排序。
  2. order by语句使用索引最左前列或使用where子句与order by自己条件组合满足索引最做前列。
  3. where子句中如果出现索引范围查询会导致order by索引失效。

来源地址:https://blog.csdn.net/d905133872/article/details/128278114

您可能感兴趣的文档:

--结束END--

本文标题: MySQL基础(六)-索引(index)详解

本文链接: https://www.lsjlt.com/news/388200.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL基础(六)-索引(index)详解
    目录 一、什么是索引? 二、索引的实现原理 三、在MySQL中,主键、unique字段上会自动添加索引。 四、索引的创建与删除 创建索引: 删除索引: 五、查看SQL语句是否使用了索引 六、索引的失效 失效的第一种情况:模糊匹配当中以“%”...
    99+
    2023-09-01
    sql 数据库
  • MySQL索引基础
    介绍     索引用于加快数据访问的速度。把计算机的磁盘比作一本字典,索引就是字段的目录,当我们想快速查到某个词语的时候只需要通过查询目录找到词语所在的页数,然后直接打开某页就可以。MySQL最常用的索引是...
    99+
    2022-10-18
  • MySQL中的索引index(超详细)
    概念: 在MySQL中,索引(index)是一种特殊的数据结构,它能够加快数据库中数据的检索速度。索引可以看做是一本书的目录,它提供了一种快速查找数据的方式。 MySQL中的索引是建立在一张表的一列或多列上的,用于加快对表中数据的查找速度...
    99+
    2023-09-02
    mysql 数据库
  • MySQL查看索引语句:SHOW INDEX 详细讲解
    概述: SHOW INDEX语句是MySQL中用于查看表索引信息的语句。它提供了有关表中索引的详细信息,包括索引名称、索引类型、关联的列等。以下是SHOW INDEX的详细说明: 语法: SHOW INDEX FROM table_name...
    99+
    2023-09-20
    mysql 数据库 java
  • mysql基础(九) 索引和视图
    索引:是一种按照特定存储格式存储的特殊数据,用于SQL查询 索引的类型:     聚集索引和非聚集索引:数据是否和索引存储在一起   主键索引和辅...
    99+
    2022-10-18
  • python基础知识之索引与切片详解
    目录基本索引嵌套索引切片numpy.array 索引 一维numpy.array 索引 二维pandas Series 索引pandas DataFrame 索引填坑总结基本索引 I...
    99+
    2022-11-13
  • SQLServer索引设计基础知识详解使用
    目录一、前言二、索引设计背景知识2.1、索引设计策略包括的任务三、常规索引设计3.1、数据库注意事项3.2、查询注意事项3.3、列注意事项3.4、索引的特征3.5、索引排序顺序设计指...
    99+
    2023-05-14
    SQL Server索引设计 SQL索引设计
  • java基础的详细了解第六天
    目录1、this关键字1.1 “this.属性”表示本类属性1.2“this”表示调用本类方法1.3“this”表示当前对象1.4引用传递进阶分析1.5对象比较1.6引用传递实际应用...
    99+
    2022-11-12
  • 【MySQL】MySQL索引详解
    Mysql索引 0.写在前面1.为什么要使用索引2.常见的索引模型3.索引维护4.回表?举例子。 0.写在前面 文章中包含了: 1.什么是索引 2.索引的数据结构,以及各自的使用场景 3.为什么要设置主键自增? 4.基于主键...
    99+
    2023-08-16
    mysql 数据库 面试
  • MySQL——索引详解
    目录 一、为什么要有索引 二、什么是索引? 三、索引的原理 四、MySQL的存储引擎 五、索引的数据结构 六、聚簇和非聚簇索引 七、索引的设计原则 一、为什么要有索引 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操...
    99+
    2023-09-04
    数据库 mysql mysql优化
  • SQL Server索引设计基础知识详解使用
    目录一、前言二、索引设计背景知识2.1、索引设计策略包括的任务三、常规索引设计3.1、数据库注意事项3.2、查询注意事项3.3、列注意事项3.4、索引的特征3.5、索引排序顺序设计指南总结一、前言 索引设计不佳和缺少索引...
    99+
    2023-04-03
    SQL Server索引设计 SQL索引设计
  • 图文并茂地讲解Mysql索引(index)
    目录前言1. 索引概述1.1 什么是索引?1.2 使用索引和不使用索引的区别1.3 索引的特点2. 索引结构2.1 概述2.2 二叉树2.3 B-Tree2.4 B+Tree2.5 ...
    99+
    2022-11-13
    mysql怎么使用索引 mysql的索引 mysql索引代码
  • MySQL基操---各类备份与索引详解
     备份MySQL服务实例运行期间,意外的停电,硬盘损坏,还有一些误操作、服务器宕机等情况。这个时候如何确保数据库能够最大程度地恢复到'正确'的状态呢?对于数据库管理人员来说,防止数...
    99+
    2022-10-18
  • 【MySQL基础】MySQL基本操作详解
    系列文章目录 第1篇:【MySQL基础】MySQL介绍及安装 第2篇:【MySQL基础】MySQL基本操作详解 文章目录 ✍1,数据库操作     🔍1.1,查看数据库     🔍1.2,创建数据库    ...
    99+
    2023-08-16
    mysql 数据库 服务器
  • MySQL-索引详解(四)
    ♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️树高千尺,落叶归根人生不易,人间真情 前言 本次MySQL—索引章节比较多,分...
    99+
    2023-09-04
    数据库 mysql 运维
  • MySQL的索引详解
    一. 索引基础 1.1 简介 在MySQL中,索引(index)也叫做“键(key)”,它是存储引擎用于快速找到记录的一种数据结构。 索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对性能的...
    99+
    2022-10-18
  • MySQL-索引详解(三)
    ♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️树高千尺,落叶归根人生不易,人间真情 目录 5.SQL性能分析 5.2 慢查询...
    99+
    2023-09-02
    数据库 mysql 运维
  • MySQL-索引详解(五)
    ♥️作者:小刘在C站 ♥️个人主页: 小刘主页  ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术 ♥️小刘私信可以随便...
    99+
    2023-09-04
    数据库 mysql 运维
  • 详解MySQL覆盖索引、索引下推
    目录 1.覆盖索引 1.1.概述 1.2.聚集索引、非聚集索引 1.3.回表查询 1.4.覆盖索引 2.索引下推 1.覆盖索引 1.1.概述 覆盖索引,是为了避免“回表查询”,从而降低查询耗时的一种使用索引的方法,所以要聊覆盖索引首先我...
    99+
    2023-09-10
    数据库 java 开发语言
  • 【MySQL】MySQL基础知识详解(一)
    MySQL select列的别名去除重复行空值参与运算着重号查询常数显示表结构过滤数据 排序使用 ORDER BY 对查询到的数据进行排序操作。使用列的别名,进行排序二级排序 分页LI...
    99+
    2023-09-04
    mysql 数据库 SQL
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作