前言:

索引是MySQL数据库中的重要对象之一,索引的目的在于提高查询效率。可以类比字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可。索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同。为了避免混乱,本文将只关注于InnoDB引擎下的B+Tree索引。

1.索引结构及原理

要想了解索引的原理,首先要知道索引的结构,下面简单介绍下B+Tree索引的结构。

首先我们要知道索引是一种数据结构。在InnoDB中,每个索引其实都是一颗B+树,B+树是为了磁盘及其他存储辅助设备而设计的一种平衡查找树(不是二叉树),在B+树中,所有的数据都在叶子节点,且每一个叶子节点都带有指向下一个节点的指针,形成了一个有序的链表。一般情况下数据库的B+树的高度一般在2~4层,这就是说找到某一键值的行记录最多需要2到4次逻辑IO,下图简单展示了B+树索引的结构。

2.索引的分类及创建方法

在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。根据叶子节点的内容,索引类型分为主键索引和非主键索引。主键索引的叶子节点存的是整行数据。在InnoDB里,主键索引也被称为聚簇索引(clustered index)。非主键索引的叶子节点内容是索引列和主键的值。在InnoDB里,非主键索引也被称为二级索引(secondary index)或辅助索引

一张InnoDB表必须有一个聚簇索引,当有主键时,会以主键作为聚簇索引;如果没有显式定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,则MySQL自动为InnoDB表生成一个隐含字段作为主键。除聚簇索引外的其他索引都可称为二级索引,比如我们常用到的唯一索引、普通索引、联合索引等。

上面讲过聚簇索引的叶子节点存的是整行数据,当某条查询使用的是聚簇索引时,只需要扫描聚簇索引一颗B+树即可得到所需记录,如果想通过二级索引来查找完整的记录的话,需要通过回表操作,也就是在通过二级索引找到主键值之后再到聚簇索引中查找完整的记录。也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。

下面介绍下索引的创建、删除等操作方法。

# 建表时指定索引
CREATE TABLE `t_index` (
`increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`col1` int(11) NOT NULL,
`col2` varchar(20) NOT NULL,
`col3` varchar(50) NOT NULL,
`col4` int(11) NOT NULL,
PRIMARY KEY (`increment_id`),
UNIQUE KEY `uk_col1` (`col1`),
KEY `idx_col2` (`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试索引'; # 创建索引(两种方法)
# 普通索引
alter table `t_index` add index idx_col3 (col3);
create index idx_col3 on t_index(col3);
# 唯一索引
alter table `t_index` add unique index uk_col4 (col4);
create unique index uk_col4 on t_index(col4);
# 联合索引
alter table `t_index` add index idx_col3_col4 (col3,col4);
create index idx_col3_col4 on t_index(col3,col4); # 删除索引
alter table `t_index` drop index uk_col4;
DROP INDEX idx_col3_col4 on t_index;

3.索引的优缺点及使用建议

索引的优点显而易见是可以加速查询,但创建索引也是有代价的。首先每建立一个索引都要为它建立一棵B+树,会占用额外的存储空间;其次当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。所以,索引的创建及使用时有原则的,下面给出几点索引使用的建议:

  • 显式创建主键索引,建议使用自增ID作为主键。
  • 只为用于搜索、排序、分组、连接的列创建索引。
  • 对经常更新的表避免创建过多的索引。
  • 建立联合索引时,可选择性高的列放在前面。
  • 尽量不要在可选择性差的列上建索引,如:性别、状态列等。
  • 尽量使用覆盖索引进行查询,避免回表带来的性能损耗。(覆盖索引包含要查询的所有列)
  • select后面只写查询需要用到的字段,去掉不需要的字段。
  • 定位并删除表中的重复和冗余索引。

总结:

其实很早就想写篇索引相关的文章,但一直没有完成,因为关于索引的文章太多了!大多也是大同小异,而且想深入解析索引需要算法相关知识,讲明白索引并不是一件容易的事。当然,本篇文章也写得很普通,只是介绍下在项目开发中实用的一些知识,索引的内容还有很多,需要我们不断的去学习。

MySQL索引知识介绍的更多相关文章

  1. MySQL 索引知识整理(创建高性能的索引)

    前言: 索引优化应该是对查询性能优化的最有效的手段了.索引能够轻易将查询性能提高几个数量级. // 固态硬盘驱动器有和机械硬盘启动器,有着完全不同的性能特性: 然而即使是固态硬盘,索引的原则依然成立, ...

  2. MySQL索引知识学习笔记

    目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...

  3. MySQL 索引的介绍与应用

    Mysql索引 一. mysql 索引 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 二:MySQL索引类型 按存储结构区分:聚集索引(又称聚类索引,簇 ...

  4. 关于MySQL索引知识与小妙招 — get get get

    一.索引基本知识 1.1 索引的优点 大大减少了服务器需要扫描的数据量,加快数据库的检索速度 帮助服务器避免排序和临时表 将随机io变成顺序io 1.2 索引的用处 速查找匹配WHERE子句的行 从c ...

  5. mysql索引知识简单记录

    简介 今天记录下索引基础知识  1.mysql单表最多支持多少个索引,索引总长度为多少? 索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型. ...

  6. mysql索引简单介绍

    索引从本质上来说也是一种表,这样的表存储被列为索引的列项值和指向真正完整记录的指针.索引对用户透明.仅仅被数据库引擎用来加速检索真实记录.有索引的表.insert和update操作会耗费很多其它时间而 ...

  7. mysql 索引type介绍

    以下全部详细解析explain各个属性含义: 各属性含义:    id: 查询的序列号    select_type: 查询的类型,主要是区别普通查询和联合查询.子查询之类的复杂查询 SIMPLE:查 ...

  8. MySQL 索引知识总结

    将 mysql 的索引以书本的索引类比比较贴切,要找到一个关键字为xxx 的条目,首先翻到索引中查找有哪些页码涉及到,无疑就缩小了范围.在这个小范围内再寻找符合条件的数据,效率就会提高许多. mysq ...

  9. mysql索引详细介绍

    博客: https://blog.csdn.net/tongdanping/article/details/79878302#%E4%B8%89%E3%80%81%E7%B4%A2%E5%BC%95% ...

随机推荐

  1. 视频+图文 String类干货向总结

    目录 一.字符串的介绍及视频讲解 二.字符串的两种创建方式 方法一:通过new创建 方法二:直接创建 三.字符串的长度获取:length()方法 四.使用 == 和equals()方法比较两个字符串 ...

  2. CLDAPReflectionDDoS(CLDAP反射放大攻击)

    CLDAP Reflection DDoS 0x01 LDAP: 全称为Lightweight Directory Access Protocol,即轻量目录访问协议,基于X.500标准: 目录服务就 ...

  3. testNG 断言

    testNG提供一个Assert类,来判断输出值是否与预期值一致,Assert常用的方法有: Assert.assertEquals():此方法可以有两个参数值,也可以有3个参数值,参数的顺序是 ac ...

  4. 【已解决】error setting certificate verify locations报错

    目录 1.问题描述 2.问题分析 3.解决方法 1.问题描述 在公司的电脑上从Github上clone项目的时候git黑窗口报错"error setting certificate veri ...

  5. Flutter 开发填坑指南

    引言 第一次在使用Flutter是在Ubuntu机器上,但是因为Android Studio还有Sdk配置问题,flutter doctor总是在这一步报错...最近又在win10上配了一下环境(真香 ...

  6. ES6中对数值的扩展

    上一节和大家学习了字符串的扩展,这一节轮到了数值,我们一起来学习数值的扩展. 剧透一下,这一节并不会很烧脑,都是介绍类的知识讲解,理解性的东西不多,初学者们也可以愉快地看完. 传统的写法 在介绍数值的 ...

  7. thinkphp5.0.x

    payload5.0.24 http://-----/index.php?s=index/think\app/invokefunction&function=call_user_func_ar ...

  8. phpstorm破解版

    查看下载:https://www.7down.com/soft/229568.html 破解:https://www.7down.com/article/305640.html 主题更换和下载:htt ...

  9. 自动化之SaltStack

    一.SaltStack 简介 Salt,,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. salt底层采用动态的连接总线, ...

  10. laravel 5.5 ajax返回错误信息

    前段ajax发送请求 $('#reg_reg').click(function () { var formData = new FormData($( "#reg_form" )[ ...