一文快速入门MySQL数据库索引

313 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

前言

前边几篇文章我们已经了解了InnoDB数据存储相关的知识,接下来我们在来看下MySQL查询相关的知识,本文主要聊一下MySQL索引相关的内容,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教。

索引概述

大部分情况下我们表中存放的记录都是非常多的,需要很多的数据页来存储这些记录,当我们查询数据的时候如何能快速的定位到记录所在的页,难道我们要遍历所有的数据页吗?这显然是不可能的,那能不能有一个像页目录一样的东西来快速定位数据页,当然有,针对数据页做的目录我们称为索引。

索引是一种数据结构,类似于我们书的目录,用于帮助我们提升查询速度。

索引类型

根据索引的具体用途,MySQL 中的索引在逻辑上分为以下 5 类:普通索引、唯一索引、主键索引、组合索引、全文索引。

普通索引

建立在普通字段上的索引被称为普通索引。

唯一索引

索引列的所有值都只能出现一次,即必须唯一,值可以为空。

主键索引

主键是一种唯一性索引,但它必须指定为PRIMARY KEY,每个表只能有一个主键。

组合索引

组合索引指在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀原则。

全文索引

全文索引的索引类型为FULLTEXT,全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。全文索引可以在varchar、char、text类型的列上创建,MyISAM支持全文索引,InnoDB在mysql5.6之后支持。

索引方法

索引方法跟索引类型一定要区分开,不要混淆了,索引方法是生成索引的方式,MySQL目前主要有以下几种索引方法:B-Tree,Hash,R-Tree

B-Tree

B-树就是B树,也是最常见的索引类型,所有值(被索引的列)都是排过序的,每个叶节点到跟节点距离相等。其具体内容等后面再说。

Hash

哈希索引是基于哈希表实现,是将索引键通过Hash运算之后,将Hash运算结果的Hash值和所对应的行指针信息存放于一个Hash表中,只有精确匹配索引所有列的查询才有效。

R-Tree

R-Tree在MySQL很少使用,仅支持geometry数据类型。

索引基本操作

查看索引

#查看索引
SHOW INDEX FROM 表名;

创建索引

CREATE [ UNIQUE |FULLTEXT] INDEX 索引名 ON 表名 ( 列名1, [列名2, ...] );

删除索引

DROP INDEX index_ name ON 表名;

索引的弊端

索引是一把双刃剑,再提供快速查询的同时,索引字段的维护也需要付出相应的代价。

  • 维护索引需要耗费数据库的资源。
  • 索引需要占用磁盘空间。
  • 当对表的数据进行增删改的时候,增删改的速度会变慢,增删改对底层数据结构进行排序。因为要维护索引,速度会受到影响。

创建索引原则

  • 较频繁的作为查询条件字段应该创建索引
  • 唯一性太差的字段不适合创建索引,尽管频繁作为查询条件,例如is_delete是否删除字段
  • 更新非常频繁的字段不适合作为索引
  • 不会出现在where子句中的字段不该创建索引

小结

为了提升查询速度,mysql针对数据页做了一个目录我们称为索引。索引是一种数据结构。可以根据用途分为普通索引、唯一索引、主键索引、组合索引、全文索引5类。