MySQL索引

目录

一、什么是索引

二、索引的原理

三、优缺点

四、分类

1、聚簇索引--顺序IO

2、非聚簇索引--随机IO

五、索引的设计原则

六、创建索引

1、创建表时创建索引

2、在已经存在的表上创建索引

3、使用ALTER TABLE语句来创建索引

        1)普通索引

        2)唯一性索引

        3)全文索引(FULLTEXT)——只能创建在char,varchar或text类型的字段上。

        4)单列索引

        5)多列索引

        6)空间索引

七、查询索引

八、删除索引

九、MySQL使用索引的场景

十、explain



索引是一种特殊的数据库结构,可以用来快速查询数据库表中的特定记录。索引是提高数据库性能的重要方式。MySQL中,所有的数据类型都可以被索引。

MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。(注意:一般数据库默认都会为主键生成索引)。

# 当我们为一张表建立主键:建立索引

# 当我们为某一个设置为唯一约束的时候,对应的也会建立索引


一、什么是索引

        模式(schema)中的一个数据库对象

        在数据库中用来加速对表的查询

        通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O

        与表独立存放,但不能独立存在,必须属于某个表

        由数据库自动维护,表被删除时,该表上的索引自动被删除。

        索引的作用类似于书的目录,几乎没有一本书没有目录,因此几乎没有一张表没有索引。

二、索引的原理

就是把无序的数据变成有序的查询

  1. 把创建的索引的列的内容进行排序

  2. 对排序结果生成倒排表

  3. 在倒排表内容上拼上数据地址链

  4. 在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据

三、优缺点

1、优:

        可以提高检索数据的速度,这是创建索引的最主要的原因;对于有依赖关系的子表和父表之间的联合查询时,可以提高查询速度;使用分组和排序子句进行数据查询时,同样可以显著节省查询中分组和排序的时间。

2、缺:

        创建和维护索引需要耗费时间,耗费时间的数量随着数据量的增加而增加;索引需要占用物理空间,每一个索引要占一定的物理空间;增加、删除和修改数据时,要动态的维护索引,造成数据的维护速度降低了。

四、分类

按「数据结构」分类:B+tree索引、Hash索引、Full-text索引。

按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引)。

按「字段特性」分类:主键索引、唯一索引、普通索引、前缀索引。

按「字段个数」分类:单列索引、联合索引。

1、聚簇索引--顺序IO

        按照数据存放的物理位置为顺序的

        索引中键值的逻辑顺序与数据行的物理顺序相同,一个表中只能有一个聚簇索引

        能提高多行检索的速度        

        对于非聚簇索引来说,每次通过索引检索到所需行号后,还需要通过叶子上的磁盘地址去磁盘内取数据(回行)消耗时间。为了优化这部分回行取数据时间,InnoDB 引擎采用了聚簇索引。

        聚簇索引,即将数据存入索引叶子页面上。对于 InnoDB 引擎来说,叶子页面不再存该行对应的地址,而是直接存储数据,这样便避免了回行操作所带来的时间消耗。

2、非聚簇索引--随机IO

        不按照数据存放的物理位置为顺序的

        索引的逻辑顺序与磁盘上的的物理存储顺序不同,一个表中可以拥有多个非聚簇索引

        对于单行的检索很快

        索引节点的叶子页面就好比一片叶子。叶子头便是索引键值。对于MYISAM引擎,如果创建 id 和 name 为索引。对于下面查询select * from user where id = 1。会利用索引,先在索引树中快速检索到 id,但是要想取到id对应行数据,必须找到改行数据在硬盘中的存储位置,因此MYISAM引擎的索引,叶子页面上不仅存储了主键id 还存储着 数据存储的地址信息。

 

五、索引的设计原则

为了使索引的使用效率更高,在创建索引的时候必须考虑在哪些字段上创建索引和创建什么类型的索引。

1.  选择惟一性索引
2.  为经常需要排序、分组和联合操作的字段建立索引
3.  为常作为查询条件的字段建立索引
4.  限制索引的数目
5.  尽量使用数据量少的索引
6.  尽量使用前缀来索引
7.  删除不再使用或者很少使用的索引

六、创建索引

创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度。

1、创建表时创建索引

创建表的时候可以直接创建索引,这种方式最简单、方便。其基本形式如下:

CREATE TABLE 表名 ( 属性名 数据类型 [完整性约束条件],
属性名 数据类型 [完整性约束条件],
…
属性名 数据类型
[UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY
[别名](属性名1 [(长度)] [ASC | DESC])
);

2、在已经存在的表上创建索引

        可通过命令查看语法(help create index)      

CREATE [ UNIQUE | FULLTEXT | SPATIAL ]  INDEX 索引名 ON 表名 (属性名 [ (长度) ] [  ASC | DESC] );

3、使用ALTER TABLE语句来创建索引

ALTER  TABLE 表名  ADD  [ UNIQUE | FULLTEXT | SPATIAL ]  INDEX 
索引名(属性名 [ (长度) ] [ ASC | DESC]);

        1)普通索引

# 直接创建索引
mysql> create index index_name on class(class_id);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0# 创建表的时候同时创建索引
mysql> create table tb_index(-> id int,-> name varchar(20),-> sex boolean,-> index(id)-> );
Query OK, 0 rows affected (0.03 sec)#使用ALTER TABLE语句来创建索引
mysql> alter table emp add index index_emp(empno);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

        2)唯一性索引

mysql> create unique index id_index on course(id);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> create table index1(-> id int unique,-> name varchar(20),-> unique index index1_id(id asc)-> );
Query OK, 0 rows affected, 1 warning (0.03 sec)mysql> alter table course add unique index_name(id);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

        3)全文索引(FULLTEXT)——只能创建在char,varchar或text类型的字段上。

mysql> create fulltext index index_name on course(name);
Query OK, 0 rows affected, 1 warning (0.16 sec)
Records: 0  Duplicates: 0  Warnings: 1mysql> create table index2(-> id int,-> info varchar(20),-> fulltext index index2_info(info)-> );
Query OK, 0 rows affected (0.10 sec)mysql> alter table course add fulltext index index_name(name);
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

         4)单列索引

mysql> create index index1_name on course(id);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> create table index3(-> id int,-> subject varchar(20),-> index index3_st(subject(10))-> );
Query OK, 0 rows affected (0.02 sec)mysql> alter table course add index index_name(name);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

        5)多列索引

        使用多列索引时一定要特别注意,只有使用了索引中的第一个字段时才会触发索引。如果没有使用索引中的第一个字段,那么这个多列索引就不会起作用。
        也就是说多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。

mysql> create table index4(-> id int,-> name varchar(20),-> sex char(4),-> index index4_ns(name,sex)-> );
Query OK, 0 rows affected (0.02 sec)

        6)空间索引

        建空间索引时,表的存储引擎必须是myisam类型,而且索引字段必须有非空约束。空间数据类型包括geometry,point,linestring和polygon类型等。平时很少用到。

mysql> create table index5(-> id int,-> space geometry not null,-> spatial index index5_sp(space)-> )engine=myisam;
Query OK, 0 rows affected, 1 warning (0.01 sec)

七、查询索引

查询索引:
show create table 表名 \G查询某张表中索引情况
show indeix from 表名;使用计划查询SQL使用索引情况
Explain select * from 表名 where id=1 \G

八、删除索引

        删除索引是指将表中已经存在的索引删除掉。一些不再使用的索引会降低表的更新速度,影响数据库的性能。对于这样的索引,应该将其删除。
        对应已经存在的索引,可以通过DROP语句来删除索引。

DROP  INDEX 索引名  ON 表名 ;
mysql> drop index index_name on class;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

九、MySQL使用索引的场景

        1) 快速查找符合where条件的记录

        2) 快速确定候选集。若where条件使用了多个索引字段,则MySQL会优先使用能使候选记录集规模最小的那个索引,以便尽快淘汰不符合条件的记录。

        3) 如果表中存在几个字段构成的联合索引,则查找记录时,这个联合索引的最左前缀匹配字段也会被自动作为索引来加速查找。
        例如,若为某表创建了3个字段(c1, c2, c3)构成的联合索引,则(c1), (c1, c2), (c1, c2, c3)均
会作为索引,(c2, c3)就不会被作为索引,而(c1, c3)其实只利用到c1索引。

        4) 多表做join操作时会使用索引(如果参与join的字段在这些表中均建立了索引的话)。

        5)若某字段已建立索引,求该字段的min()或max()时,MySQL会使用索引

        6)对建立了索引的字段做sort或group操作时,MySQL会使用索引

十、explain

explain select * from table where id=1;

EXPLAIN分析结果的含义:

        table:这是表的名字。   

        type:连接操作的类型,ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)

        possible_keys:可能可以利用的索引的名字      

        Key:它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。    

        key_len:索引中被使用部分的长度,以字节计。

        ref:它显示的是列的名字(或单词“const”),MySQL将根据这些列来选择行

        rows:MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1

        Extra:这里可能出现许多不同的选项,其中大多数将对查询产生负面影响

索引失效的情况:浅谈mysql数据库索引 - 简书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝奥声智能工业安全用电监测与智慧能源解决方案

能源管理变得越来越重要。如今,能源成本已成为国内预算的核心因素,因此用电监控对大多数现代企业来说都很重要。许多企业在日常能源消耗监控中面临着一些挑战,因为它们的规模庞大,基础设施多样化,灵活性低,…

Java之包,权限修饰符,final关键字详解

包 2.1 包 包在操作系统中其实就是一个文件夹。包是用来分门别类的管理技术,不同的技术类放在不同的包下,方便管理和维护。 在IDEA项目中,建包的操作如下: 包名的命名规范: 路径名.路径名.xxx.xxx // 例如&#xff…

sql数据导出到excel

一、打开Navicat Premium 12 二、导出

R语言处理缺失数据(1)-mice

#清空 rm(listls()) gc()###生成模拟数据### #生成100个随机数 library(magrittr) set.seed(1) asd<-rnorm(100, mean 60, sd 10) %>% round #平均60&#xff0c;标准差10 #将10个数随机替换为NA NA_positions <- sample(1:100, 10) asd[NA_positions] <- NA #转…

ClickHouse(二十一):Clickhouse SQL DDL操作-临时表及视图

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…

数据结构算法--4堆排序

堆排序过程: >建立堆(大根堆) >得到堆顶元素&#xff0c;为最大元素 >去掉堆顶&#xff0c;将堆最后一个元素放到堆顶&#xff0c;此时可通过一次调整使堆重新有序 >堆顶元素为第二大元素 >重复步骤3&#xff0c;直到堆变空 此时是建立堆后的大根堆模型 将…

ThinkPHP6.0+ 使用Redis 原始用法

composer 安装 predis/predis 依赖&#xff0c;或者安装php_redis.dll的扩展。 我这里选择的是predis/predis 依赖。 composer require predis/predis 进入config/cache.php 配置添加redis缓存支持 示例&#xff1a; <?php// -----------------------------------------…

国内常见的几款可视化Web组态软件

组态软件是一种用于控制和监控各种设备的软件&#xff0c;也是指在自动控制系统监控层一级的软件平台和开发环境。这类软件实际上也是一种通过灵活的组态方式&#xff0c;为用户提供快速构建工业自动控制系统监控功能的、通用层次的软件工具。通常用于工业控制&#xff0c;自动…

基于百度文心大模型创作的实践与谈论

文心概念 百度文心大模型源于产业、服务于产业&#xff0c;是产业级知识增强大模型。百度通过大模型与国产深度学习框架融合发展&#xff0c;打造了自主创新的AI底座&#xff0c;大幅降低了AI开发和应用的门槛&#xff0c;满足真实场景中的应用需求&#xff0c;真正发挥大模型…

PostMan 测试项目是否支持跨域

使用PostMan可以方便快速的进行跨域测试。 只需要在请求头中手动添加一个Origin的标头&#xff0c;声明需要跨域跨到的域&#xff08;IP&#xff1a;端口&#xff09;就行&#xff0c;其余参数PostMan会自动生成。添加此标头后&#xff0c;请求会被做为一条跨域的请求来进行处…

抖音短视频SEO矩阵系统源码开发

一、概述 抖音短视频SEO矩阵系统源码是一项综合技术&#xff0c;旨在帮助用户在抖音平台上创建并优化短视频内容。本文将详细介绍该系统的技术架构、核心代码、实现过程以及优化建议&#xff0c;以便读者更好地理解并应用这项技术。 二、技术架构 抖音短视频SEO矩阵系统采用前…

STM32 中断复习

中断 打断CPU执行正常的程序&#xff0c;转而处理紧急程序&#xff0c;然后返回原暂停的程序继续运行&#xff0c;就叫中断。 在确定时间内对相应事件作出响应&#xff0c;如&#xff1a;温度监控&#xff08;定时器中断&#xff09;。故障处理&#xff0c;检测到故障&#x…

07-微信小程序-注册页面-模块化

07-微信小程序-注册页面 文章目录 注册页面使用 Page 构造器注册页面参数Object初始数据案例代码 生命周期回调函数组件事件处理函数setData()案例代码 生命周期模块化 注册页面 对于小程序中的每个页面&#xff0c;都需要在页面对应的 js 文件中进行注册&#xff0c;指定页面…

解决Windows下的docker desktop无法启动问题

以管理员权限运行cmd 报错&#xff1a; docker: error during connect: Post http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.40/containers/create: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows,…

哪些人适合参加大数据培训班?

互联网加速职场变革&#xff0c;大数据浪潮席卷全球。日前&#xff0c;Python、大数据、人工智能是当今最热门的话题。大数据存储、大数据分析、 人工智能等开发人才需求旺盛。 大数据培训班有大数据分析培训班、大数据开发培训班&#xff0c;JAVA培训班 大数据班适学人群…

ios小组件报错:Please adopt containerBackground API

iOS 17 小组件报错:Please adopt containerBackground API 使用下面的方法解决了: 代码: extension View {func widgetBackground(_ backgroundView: some View) -> some View {if #available(iOSApplicationExtension 17.0, *) {return containerBackground(for: .wi…

axios 各种方式的请求 示例

GET请求 示例一&#xff1a; 服务端代码 GetMapping("/f11") public String f11(Integer pageNum, Integer pageSize) {return pageNum " : " pageSize; }前端代码 <template><div class"home"><button click"getFun1…

【正点原子STM32连载】第十九章 通用定时器输入捕获实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第十…

2023七夕小程序

又是一年七夕节 往年七夕小程序 2020 https://blog.csdn.net/chen_227/article/details/107062998 2022 视频 QiXi2022 代码 https://gitee.com/chen227/qixi2022-qt-qml 2023 效果 代码 https://gitee.com/chen227/qixi2023-qt-qml

Android Studio中引入MagicIndicator

1.github中下载文件 GitHub - hackware1993/MagicIndicator: A powerful, customizable and extensible ViewPager indicator framework. As the best alternative of ViewPagerIndicator, TabLayout and PagerSlidingTabStrip —— 强大、可定制、易扩展的 ViewPager 指示器框…