前言

百度百科索引:

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的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. Java 常用类 String的使用---测试

    1 package com.bytezero.stringclass; 2 3 import org.junit.Test; 4 5 /** 6 * 7 * 8 * 9 * @author Bytez ...

  2. Java 异常处理(2) : 方法重写的规则之一:

    1 package com.bytezero.throwable; 2 3 import java.io.FileNotFoundException; 4 import java.io.IOExcep ...

  3. Asp .Net Web Forms 系列:配置图片防盗链的几种方法

    通过 URL Rewrite Module 组件 URL Rewrite Module 是一个用于在 ASP.NET Web Forms 或其他基于 IIS 的 Web 应用程序中重写 URL 的强大 ...

  4. vscode 快捷键更换 ctrl + h 全局搜索 改为 f1 - 个人习惯 - 针对某些跨文件函数不能自动跳转

    vscode 快捷键更换 ctrl + h 全局搜索 改为 f1 - 个人习惯 - 针对某些跨文件函数不能自动跳转 原来 f1 换成 ctrl + f1 它一般用 ctrl + shift + p 调 ...

  5. pollute 污染 pol=por=pro 向前 lut=释放 结合ps软件里面lut概念记忆

    pollute 污染 pol = por = pro = 向前 lut = 释放 (ps里面有lut的概念) e 动词 向前释放 -> 污染 弄脏 简单记忆 poll / ute poll - ...

  6. 什么是docker的多阶段构建

    Docker多阶段构建是一种技术,允许在不同的构建阶段中使用不同的基础镜像,并只复制构建所需的文件和依赖项.这种技术旨在减少最终生成的Docker镜像的大小和运行时的资源消耗. 多阶段构建的一般工作流 ...

  7. MinimalApis自动注册

    前言 在Asp.Net Core 6 推出了最小 Api(MinimalApis)来简化WebApi的开发,在前后端分离的趋势下越来越多的后端服务只提供Api接口,但是用Controller的开发模式 ...

  8. dbVisualizer之中文乱码

    在SQL Commander中,sql语句中如果有中文,显示是'口口口'. 解决办法如下: 在Tools->tool Properties->General->Appearance- ...

  9. 使用nodejs从控制台读入内容

    在写算法题的时候,基本上都需要输入输出语句,在大多数练题网站上当想用js书写算法题时,发现不知道怎么输入,其实Node是提供了一个readline模块来实现此功能的 tip 笔者用过的练题网站只有le ...

  10. WPF状态保存

    由于WPF做客户端的时候,它不像BS那样有Session,Cookie给你使用,所以保存状态你首先想到的就是数据库了. 但是你不可能什么都放在数据库,为此还专门为它建立一张表. 而WPF中能用到的除了 ...