基础知识

一张数据表中具有百万级的数据时,如何精确且快速的拿出其中某一条或多条记录成为了人们思考的问题。

InnoDB 存储引擎的出现让这个问题得到了很好的解决, InnoDB 存储引擎是以索引来进行数据的组织,而索引在 MySQL 中也被称之为键,因此 UNIQUE KEY , PRIMARY KEY 约束字段会作为索引字段。

当没有明确指出 PRIMAY KEY 时, InnoDB 存储引擎会自动的创建一个6字节的隐藏主键用于组织数据,但是由于该主键是隐藏的所以对查询没有任何帮助。

索引相当于一本大字典的目录,有了目录来找想要的内容就快很多,否则就只能进行一页一页的遍历查询

查找过程

索引的查找过程是依照 B+ 树算法进行查找的,而每一张数据表都会有一个且只能有一个与之对应的树

只有最下面一层节点中存储一整行记录

第二层及第一层中黄色部分为指针

如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的 B+ 树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

索引分类

索引分为聚集索引与辅助索引

聚集索引

聚集索引是会直接按照 B+ 树进行查询,由于 B+ 树的底层叶子节点是一整行记录,所以聚集索引能够十分快速的拿到一整行记录。

值得注意的是,一张数据表中只能有一个聚集索引。

辅助索引

辅助索引的树最底层的叶子节点并不会存储一整行记录,而是只存储单列索引的数据,并且还存储了聚集索引的信息。

通过辅助索引进行查询时,先拿到自身索引字段的数据,再通过聚集索引拿到整行记录,也就是说辅助索引拿一整行记录而言需要最少两次查询。

而一张数据表中可以有多个辅助索引。

创建索引

索引类型

索引名类型INDEX(field)普通索引,只加速查找,无约束条件PRIMARY KEY(field)主键索引,加速查找,非空且唯一约束UNIQUE(field)唯一索引,加速查找,唯一约束INDEX(field1,field2)联合普通索引PRIMARY KEY(field1,field2)联合主键索引UNIQUE(field1,field2)联合唯一索引FULLTEXT(field)全文索引SPATIAL(field)空间索引

举个例子来说,比如你在为某商场做一个会员卡的系统。这个系统有一个会员表有下列字段:会员编号INT会员姓名VARCHAR(10)会员身份证号码VARCHAR(18)会员电话VARCHAR(10)会员住址VARCHAR(50)会员备注信息TEXT那么这个 会员编号,作为主键,使用PRIMARY会员姓名 如果要建索引的话,那么就是普通的INDEX会员身份证号码 如果要建索引的话,那么可以选择UNIQUE(唯一的,不允许重复)# 除此之外还有全文索引,即FULLTEXT会员备注信息如果需要建索引的话,可以选择全文搜索。用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的INDEX也可以。但其实对于全文搜索,我们并不会使用MySQL自带的该索引,而是会选择第三方软件如Sphinx,专门来做全文搜索。# 其他的如空间索引SPATIAL,了解即可,几乎不用各个索引的应用场景索引定义

语法介绍

索引应当再建立表时就进行创建,如果表中已有大量数据,再进行创建索引会花费大量的时间。

-- 方法一:创建表时CREATETABLE表名 (                字段名1数据类型 [完整性约束条件…],                字段名2数据类型 [完整性约束条件…],                [UNIQUE| FULLTEXT | SPATIAL ]INDEX|KEY[索引名]  (字段名[(长度)]  [ASC|DESC])                );-- 方法二:CREATE在已存在的表上创建索引CREATE[UNIQUE| FULLTEXT | SPATIAL ]INDEX索引名ON表名 (字段名[(长度)]  [ASC|DESC]) ;-- 方法三:ALTER TABLE在已存在的表上创建索引ALTERTABLE表名ADD[UNIQUE| FULLTEXT | SPATIAL ]INDEX索引名 (字段名[(长度)]  [ASC|DESC]) ;-- 删除索引:DROP INDEX 索引名 ON 表名字;

功能测试

--  准备表,注意此时表没有设置任何类型的索引createtables1(        id int,        number varchar(20));-- 创建存储过程,实现批量插入记录delimiter $$-- 声明存储过程的结束符号为$$createprocedure auto_insert1()        BEGIN                declare i int default1;-- 声明定义变量while(i <1000000)doinsertinto s1 values                                (i,concat('第', i,'条记录'));                set i = i +1;endwhile;        END $$-- 存储过程创建完毕delimiter ;-- 调用存储过程,自动插入一百万条数据call auto_insert1();

在无索引的情况下,查找 id 为 567891 的这条记录,耗时 0.03s

mysql>select* from s1 where id =567891;+--------+--------------------+| id    | number            |+--------+--------------------+|567891| 第567891条记录    |+--------+--------------------+1rowinset (0.33sec)

接下来为 id 字段建立主键索引后再进行查找,耗时为 0.00s

mysql> ALTER TABLE s1 MODIFY idintPRIMARY KEY;Query OK,0rowsaffected(4.76sec)  -- 创建索引花费寺庙Records: 0  Duplicates: 0  Warnings: 0mysql>select*froms1whereid=567891;+--------+--------------------+| id    | number            |+--------+--------------------+|567891| 第567891条记录    |+--------+--------------------+1rowinset(0.00sec) 再次查找则快了很多

了解mysql文章_一篇文章带你深入了解MySQL 索引相关相关推荐

  1. java 不重启部署_一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

    一.通过配置文件控制静态资源的热部署 在配置文件 application.properties 中添加: #表示从这个默认不触发重启的目录中除去static目录 spring.devtools.res ...

  2. java ee 值范围_一篇文章带你读懂: Java EE

    原标题:一篇文章带你读懂: Java EE 点击上图,查看教学大纲 何为 Java EE Java EE是一个标准中间件体系结构 不要被名称"Java PlatformEnterprise ...

  3. css 科技 边框_一篇文章带你学习CSS3图片边框

    这篇文章我们来讲一下在网站建设中,一篇文章带你学习CSS3图片边框.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 使用CSS3 border-image 属性,你可以在元素 ...

  4. python人脸识别防小偷_一篇文章带你了解Python 人脸识别有多简单

    今天的Python学习教程给大家介绍一个世界上最简练的人脸辨认库 face_recognition,你可以应用 Python 和命令行工具进行提取.辨认.操作人脸. 基于业内领先的 C++ 开源库 d ...

  5. python人脸识别实验报告总结_一篇文章带你了解Python 人脸识别有多简单

    原标题:一篇文章带你了解Python 人脸识别有多简单 今天的Python学习教程给大家介绍一个世界上最简洁的人脸识别库 face_recognition,你可以使用 Python 和命令行工具进行提 ...

  6. 两个相邻盒子的边框怎么只显示一个_一篇文章带你快速理解盒子模型「经典案例」...

    今天带大家快速理解盒子模型,直接上代码: css盒子 我的css盒子测试模型 上面代码没有任何难度,只是写了一个div标签,大家已经知道,div标签是块级元素,所以会占满一行: 但是我们也注意到了图片 ...

  7. 一篇文章带你读懂 MySQL 和 InnoDB

    作者 | Draveness  原文地址 | http://draveness.me/mysql-innodb.html 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 s ...

  8. mql 查询多结果_一篇文章带你全面掌握Excel中的各种数据查询知识与技巧

    数据查询是Excel数据处理中的一项核心业务,也是日常办公中使用频率非常高的一项操作.数据查询业务需求多,而且具有较强的技巧性,因此它也是职场必学的一门技能. 本篇文章从最基本的数据查询的概念讲起,逐 ...

  9. button按钮样式_一篇文章带你了解CSS3按钮知识

    在实际开发中,按钮的应用是必不可少.使用 CSS 来制作按钮,可以更有新意,更有趣,也可以自定义自己想要的样式. 一.平面样式CSS按钮 平面样式按钮的使用现在非常流行,并且符合无处不在的平面设计趋势 ...

最新文章

  1. linux sh for ls,Linux shell for while 循环
  2. 度量学习:ArcFace算法和工程应用总结
  3. CF888G Xor-MST (01字典树+MST)
  4. 人与人的差距在于认知
  5. WINDOWS下与LINUX下写C程序的区别
  6. 一个用于伪造IP地址进行爆破的BurpSuite插件:BurpFakeIP
  7. 计算机科学与因果关系,计算机科学与技术
  8. 网络服务器分为文件服务器通信服务器和,近代中国落后、贫困的根本原因是()...
  9. php explode 循环,PHP explode 切割字串 快速取得最後一個值
  10. mvn使用assembly打包所有的moudle为一个tgz文件
  11. 作业帮:字符串反转(头部插入)
  12. Google 宣布 Kotlin-first 已四年,为什么 Java 开发者仍不买账?
  13. C++面试题-面向对象-面向对象概念
  14. python调用go并把结果传回go_从Go调用Python函数并获取函数返回值
  15. hibernate 入门案例
  16. 完成 Orange3 数据挖掘 汉化版
  17. 【python】实战:“唱啥”app后台开发
  18. 简账(开源记账软件)-数据库设计
  19. 12C GDS安装简记
  20. 台电TBOOK16PRO安装凤凰安卓系统

热门文章

  1. python用tsne降维图像_python代码实现TSNE降维数据可视化教程
  2. 找工作java还是python有用_你觉得学 Python 还是 Java 更好找工作?
  3. python3模拟键盘输入_Python模拟键盘输入
  4. 安卓手机如何投屏到电视上_手机如何投屏到电视机上?
  5. HashMap 面试常见的6连问,你能扛得住吗?
  6. 如何写出优雅的API
  7. Java仿百度网盘,拿来学习/搞外快,都是极好的选择
  8. 5W 字的 Linux 知识总结
  9. 【Spring注解系列06】FactoryBean注入对象用法
  10. Eclipse导入项目常见问题----jdk版本问题(有个红色感叹号)01