博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sql - 索引
阅读量:6829 次
发布时间:2019-06-26

本文共 1186 字,大约阅读时间需要 3 分钟。

一、什么是索引?

索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。

例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。

二、索引的特点

为表设置索引的优点:

  • 建立索引的目的是加快对表中记录的查找或排序(最主要的原因)。

为表设置索引要付出代价的:

  • 一是增加了数据库的存储空间.

  • 二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。数据库索引就是为了提高表的搜索效率而对某些字段中的值建立的目录 。

三、索引分类(聚集索引与非聚集索引)

1、聚集索引:

聚集索引的意思可以理解为顺序排列,比如一个主键自增的表即为聚集索引,即id为1的存在于第一条,id为2的存在于第二条...假使数据库中是使用数组来存放的这张表中的数据,那么如果我需要查找第100条,那么直接第一条数据的地址加上100即为第一百条的地址,一次就能查询出来。

因为数据库中的数据只能按照一个顺序进行排列,所以聚集索引一个数据库只能有一个。在mysql中,不能自己创建聚集索引,主键即为聚集索引,如果没有创建主键,那么默认非空的列为聚集索引,如果没有非空的列那么会自动生成一个隐藏列为聚集索引。

所以一般在mysql中,我们创建的主键即为聚集索引,数据是按照我们的主键顺序进行排列。所以在根据主键进行查询时会非常快。

2、非聚集索引

该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。

举个例子,在一个user表中,有一个id_num,即身份号,此不为主键id。那么这些数据在存储的时候都是无序的,

比如:

  • id 为 1 的 id_num 为 110,

  • id 为 2 的 id_num 为 97,

  • id 为 3 的 id_num 为 88,

  • id 为 4 的 id_num 为 99,

  • id 为 5 的 id_num 为 96

那么如果我要查找 id_num 为56 的人,那么只能一条一条的遍历,n条就需要查询n次,时间复杂度为O(n),这是非常耗费性能的。

所以,现在就需要为id_num 增加非聚集索引,添加了非聚集索引后,会给 id_num 进行排序(内部使用结构为B+树),并且排序后,我只需要查询此目录(即查询B+树),很快就知道为 id 为56的在数据库中的第 67 条,而不需要在去遍历表中的所有数据。

所以,在非聚集索引中,不重复的数据越多,那么索引的效率越高。

转载于:https://juejin.im/post/5ab846ed6fb9a028e11fed8e

你可能感兴趣的文章
pymongo 通过跳板机连接阿里云 mongoDB
查看>>
1130 host is not allowed to connect to
查看>>
ASP.NET 构建高性能网站 第1篇
查看>>
ASP.NET Web API 记录请求响应数据到日志的一个方法
查看>>
viewpager的pageradapter等adapter
查看>>
Java内部类的使用小结
查看>>
使用Git Submodule管理子模块
查看>>
【CSS】之引入方式
查看>>
C语言中文件操作总结
查看>>
MySQL修改root密码的多种方法
查看>>
硬件的一些性能指标
查看>>
day2-cacti
查看>>
MFC绘图
查看>>
Codevs 1744 格子染色==BZOJ 1296 粉刷匠
查看>>
最小生成树-Prim算法和Kruskal算法
查看>>
(6)dd命令安装Linux
查看>>
机器学习第3课:线性代数回顾(Linear Algebra Review)
查看>>
MathType使用中的四个小技巧
查看>>
ajax
查看>>
【转】淘测试---新时代的测试工程师
查看>>