前言

百度百科索引:

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

索引是一种数据结构,是一种排好序能快速查找的数据结构,利于排序和查询。

正文

索引其实就是已经排好序的数据结构,因为已经排序好的东西,所以有很多规律,那么这个时候就可以通过算法来实现更加高效的查找。

比较深入一点的解释就是:

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用指向数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

举个例子哈:

上面这个图,可以看到,创建的索引如左边这样。

如果数据结构如右边这样。如果是要找到77,那么可以查34,发现大于32,然后找右边,然后找89,发现小于,然后再左边找到了77。

如果77对应了2,那么这个2就是主键的值了,那么就用主键的值进行回表,查到到真实的数据。主键其实也是一颗树,但是主键对应的是真实数据。

也就是说查找两颗树,然后就可以找到数据了。当然上面是b-树哈。在innordb中是b+树,后面再介绍。

然后这里也说明了,为什么我们在开发的时候为什么去做逻辑删除,而不怎么做物理删除,其实原因也较为简单,一个是要有查询记录,后面可以查到这条数据怎么没的,当然这个也可以写日志表。

还有一个原因,那么就是说如果删除了数据,那么索引会发生变化,那么就得去改索引数据结构了。

也就是说索引其实是可以单独出来作为一个数据库的,它里面有独立的增删改查,一般是查。

因为索引单独出来数据库的,随着表的数据的数量增加,那么索引也是会增加的。

那索引是不可能全部存在内存中的,要是全部存在内存中一个是内存不够,第二个是要有一个持久化的功能,不然一关机就炸了。

索引的好处:

1.提高是数据的检索效率,降低数据库的IO成本。

2.以为索引是已经排好序的,所以用索引去排序,降低数据排序的成本,降低cpu的消耗。

索引的劣势:

1.索引是安装某种数据格式存储的结构,也可以理解为另外一张表,该表保存了主键与索引字段,并指向实体表记录,索引列消耗空间。

2.如果更新数据的时候,索引是需要更新的,会降低表的更新速度。因为是等索引更新完了,然后才会表去插入成功,才算一次成功,保持他们的一致性。

3.需要dba去维护索引,因为索引建立是变化的,dba需要找出最优索引。

那么什么时候用索引呢?

1.主键建议唯一索引,这个就不用说了,因为一般找会用到主键。

2.频繁的查询条件的字段应该创立索引。

3.查询中与其他表关联的字段,外键关系建立索引。

4.查询中的排序字段,排序字段如果通过索引去访问将大大提高排序速度。

5.查询中统计或者分组字段

不合适索引:

1.频繁更新的字段。

2.不作为查询的字段,也就是不写在where的字段。

3.表记录不多

4.数据重复且分布平均的表字段,如果某个数据列包含许多重复的内容,为他创建索引效果不大,比如性别

如果一个表2000条数据,索引列为1980个不同值,那么索引的选择性为:1980/2000,这个值越接近1,效率越高。

索引物理分类:

  1. 聚集索引

  2. 非聚集索引

索引逻辑的分类:

单值索引:单列作为索引,一个表可以有多个单值索引。

唯一索引:索引的列的值必须唯一,单允许有空值。就是索引列的每一个都完全不一样,也就是说100个人没有一个长的一样的。

复合索引:一个索引包含多个列。

索引语句,建议5个索引:

创建:

create [unique] INDEX indexname ON table(columname)

alter table add unique indexname ON (columname)

删除:

drop index indexname on table

查看:

show index from tablename

这样就可以查看到索引字段了。

non_unique 是否是唯一字段、。

seq_in_index 表示联合索引的顺序

Collation 指的是列以什么方式存储在索引中,A表示升序,B表示降序,NULL表示未排序

cardinality 是基数的意思,表示索引中唯一值的数目的估计值。我们知道某个字段的重复值越少越适合建索引,所以我们一般都是根据Cardinality来判断索引是否具有高选择性,如果这个值非常小,那就需要重新评估这个字段是否适合建立索引。

Sub_part 前置索引的意思,如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。

Packed 指示关键字如何被压缩。如果没有被压缩,则为NULL。压缩一般包括压缩传输协议、压缩列解决方案和压缩表解决方案。

Null 如果列含有NULL,则含有YES。

Index_type 表示索引类型,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。

Comment Index_comment 注释的意思。

mysql 索引结构:

1.Btree 索引

2.hash 索引

3.full-text 全文索引

4.R-Tree 索引

用Btree 举例:

盗图:

1.浅蓝色的块为一个磁盘块

2.深蓝色表示数据项

3.黄色部分表示指针

比如说查找29。

那么每次都是从磁盘块一加载。

对比17-35。

然后29>12 所以不是p1,然后29在26和30之间,然后根据p2指向磁盘块3,然后加载磁盘块3,一共3次io。

再进行重复的操作,找到29。

值得注意的是,真实的数据存放在叶子节点中,就是下面那一排,所以没有说去找8这个的说法。

非叶子节点不存储真实数据,只存储搜索方向的数据项,如17和35并不是指正的指向数据表某个数据。

下一节

索引优化

mysql 重新整理——索引简介[七]的更多相关文章

  1. MySQL中的索引简介

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 一. 索引的优点 为什么要创建索引?这是因为,创建索引可以大大提高系统的查询性能. 第一.通过创建唯一性索引,可以保 ...

  2. mysql优化整理(索引)

    什么是索引? 索引是表记录的单个或多个字段重新组织的一种方法,其目的是提高数据库的查询速度,本质上就是一种数据结构. 索引的类型:primary(主键).secondary(其他) 索引的数据结构 I ...

  3. MySQL中的索引优化

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 过多的使用索引将会造成滥用.因此索引也会有它的缺点.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 ...

  4. 【Mysql】索引简介

    本文口味:番茄炒蛋,预计阅读:10分钟. 博客又停更了两个月,在这期间,对人生和世界多了许多思考.在人生的不同阶段,会对生活和世界有着不一样的认知,而认知的改变也会直接反应在行为模式之中. 对于生活的 ...

  5. mysql之索引简介

    索引分类 mysql在存储数据时,是按着主键的顺序存储的.主键索引是物理索引,其他索引都是逻辑索引. 普通索引 普通索引是最基本的索引,没有任何限制的索引,普通索引列的数据可以重复.其唯一的任务就是加 ...

  6. MySQL基础整理(一)之SQL基础(未完成)

    大家好,我是浅墨竹染,以下是MySQL基础整理(一)之SQL基础 1.SQL简介 SQL(Structure Query Language)是一种结构化查询语言,是使用关系模型的数据库应用语言. 2. ...

  7. MySQL性能优化---索引

    一.什么是索引 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里 ...

  8. mysql优化之索引篇

    对mysql优化是一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索引.主键索引.唯一索引unique.全文索引] c: 分表技术(水平 ...

  9. Mysql基本操作整理

    1.登录数据库 格式: mysql -h主机地址 -u用户名 -p用户密码 –P端口 –D数据库 –e “SQL 内容”>mysql -uroot -p 数据库名称~~~~~~~~~~~~~~~ ...

  10. 数据库 MySQL进阶之索引

    数据库的索引非常重要,基本面试数据库的问题都在索引上,所以这里小编整理出来,一方面为了自己复习,一方面也方便大家. 一,索引前传 在了解数据库索引之前,首先有必要了解一下数据库索引的数据结构基础,那么 ...

随机推荐

  1. [VueJsDev] 快速入门 - vscode 插件推荐

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html Vscode 插件推荐 ::: details 目录 目录 ...

  2. 测试打包失败 已解决 分析过程 - 关键字 Jenkins nexus package-lock.json npm install build

    Jenkins 打包失败 npm run build 总是失败,每次失败报错还不一样. 然后 npm install 每次安装 还总有包超时 MobaXterm1_CHS1 SSH 链接,手工安装也不 ...

  3. 别名路径跳转 - vscode 插件

    别名路径跳转 - vscode 插件

  4. 火柴 基于everything的搜索软件 软件推荐 Ctrl+Ctrl 显示 tab转换 本机搜索和网络搜索

    https://www.huochaipro.com/

  5. 可穿戴心电ECG监测的技术路径及特点

    在传统的医疗设备中,监测心跳速率和心脏活动是经由测量电生理讯号与心电图 (ECG) 来完成的,需要将电极连接到身体来量测心脏组织中所引发电气活动的信号.常见的设备用医院的心电图机,长期监护的动态心电仪 ...

  6. Grails批改默认启动端口

    Grails修改默认启动端口 Grails默认启动端口号是8080,有几种修改的方式: 一.在官网文档中有介绍: grails -Dserver.port=8090 run-app -Dserver. ...

  7. FFmpeg命令行之ffmpeg

    一.简述 ffmpeg是一个非常强大的工具,它可以转换任何格式的媒体文件,并且还可以用自己的AudioFilter以及VideoFilter进行处理和编辑.有了它,我们就可以对媒体文件做很多我们想做的 ...

  8. Python解压当天创建的ZIP文件到指定的文件夹中

    1. 首先,导入了需要使用的模块: - `zipfile`:用于处理ZIP文件的模块. - `os`:提供了与操作系统交互的功能. - `shutil`:用于高级文件操作,例如移动文件等. - `da ...

  9. 纯前端实现 JPG 图片压缩 | canvas

    在线 Demo 体验地址 →: https://demos.sugarat.top/pages/jpg-compress/ 前言 在迭代图床应用时,需要用到图片压缩,在之前分享了使用 UPNG.js ...

  10. quartus之LPM_MULT测试

    quartus之LPM_MULT测试 1.基本作用 一个专用的乘法器,可以调用DSP单元的IP,可以提高设计中的运算效率. 2.实际操作 `timescale 1ns/1ns module mult_ ...