什么是索引?

MySql官方对此的解释为:索引是帮助MySql高效获取数据的数据结构。索引是一种用于快速查询和检索数据的数据结构。
MySql中的索引结构有: B+树和Hash。


MySql中有哪些索引?

单列索引

单列索引:单列索引中包含(普通,唯一,主键,前缀)这四个索引. 一个索引只包含单个列,但一个表中可以有多个单列索引。
普通索引:普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和NULL。
唯一索引:索引列中的值必须是唯一的,但是允许为空值,
主键索引:是一种特殊的唯一索引,不允许有空值。
前缀索引 :前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小, 因为只取前几个字符。


组合索引

组合索引: 在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。这个如果还不明白,等后面举例讲解时在细说 


全文索引

全文索引: 全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6之前只有MYISAM引擎支持全文索引,5.6之后InnoDB也支持了全文索引。


空间索引

空间索引 : 是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。 在创建空间索引时,使用SPATIAL关键字。


InnoDB存储引擎下的索引分类

根据索引的存储形式分为聚集索引和二级索引。

分类 含义 特点
聚集索引(Clustered Index) 将数据存储与索引放到一起,索引结构的叶子结点保存了行数据 必须有,且只有一个
二级索引(Secondary Index) 将数据和索引分开存储,索引结构的叶子结点关联的事对应的主键 可以存在多个

聚集索引选取规则:

如果存在主键,主键索引就是聚集索引
如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。


添加索引的sql语句

添加PRIMARY KEY(主键索引)

1
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 

添加UNIQUE(唯一索引)

1
ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 

添加INDEX(普通索引)

1
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

添加FULLTEXT(全文索引)

1
ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 

添加多列索引

1
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

索引的底层数据结构

哈希索引

对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。

BTree树索引

是一种很普遍的数据库索引结构。其特点是定位高效、利用率高、自我平衡,理论上,使用Btree在亿条数据与100条数据中定位记录的花销相同。


为什么索引会提高查找速度?

这首先要从mysql的存储说起: mysql的存储形式是页, 在没有使用索引时,

定位到记录所在的页:需要遍历双向链表,找到所在的页
从所在的页内中查找相应的记录:由于不是根据主键查询,只能遍历所在页的单链表了,这种查找时间复杂度为O(n)
当添加索引后: 就是将无序的数据变成有序(相对),通过 “目录” 就可以很快地定位到对应的页上了!(二分查找,时间复杂度近似为O(logn))


使用索引的注意事项

经常需要搜索的列上,可以加快搜索的速度;
在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
在经常需要排序的列上创 建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
对于中到大型表索引都是非常有效的,但是特大型表的话维护开销会很大,不适合建索引
在经常用在连接的列上,这 些列主要是一些外键,可以加快连接的速度;
避免 where 子句中对宇段施加函数,这会造成无法命中索引。
在使用InnoDB时使用与业务无关的自增主键作为主键,即使用逻辑主键,而不要使用业务主键。
删除长期未使用的索引。

引用地址 JavaGuide