MySQL索引详解

什么是索引

索引是存储引擎用于快速找到记录的一种数据结构,索引类似一本书的目录,我们可以快速的根据目录查找到我们想要的内容的所在页码,索引的优化应该是对查询性能优化最有效的手段了。

索引的类型

索引是在MYSQL的存储引擎层中实现的,而不是在服务层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型。即使多个存储引擎支持同一种类型的索引,其底层实现也可能不同。

B-Tree索引B-Tree索引是最常见的索引类型,也是创建索引时默认的类型。B-Tree是一种多叉平衡树,B-Tree 结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。一般用于数据库的索引,综合效率较高。

等值匹配 可用于

=
!=
<>
IN
NOT IN
<=>

查询语句的优化 范围匹配

可用于

>
>=
<
<=
BTEWEEN AND

等范围查询语句的优化 匹配最左前缀

name like bai%

这种语句,是可以使用name字段上建立的索引来优化查询的,但是对于

name like %bai

则没有办法使用索引了 覆盖索引

覆盖索引是指所有需要查询的字段都在索引已经存在了,那么就不需要再去查询数据了,这种查询效率很高。

select id where id >100

排序

BTREE索引还可以用于查询中的order by 操作。

哈希索引哈希索引基于哈希表实现,只有Memory引擎显示支持哈希索引,使用哈希索引可以一次定位,所以 Hash 索引的查询效率要远高于 B-Tree 索引。但是哈希索引是有很多限制的:

  • 只有精确匹配索引所有列的查询才有效,因为哈希索引是利用索引的所有列的字段值来计算哈希值的,
  • 只支持等值比较查询,不能用于范围查询。
  • 哈希索引的只包含索引字段的哈希值he和指向数据的指针,所以不能使用索引中的值来避免读取行。
  • 哈希索引的数据并不是顺序存储的,无法用于排序。

全文索引

聚集索引&非聚集索引

聚集索引聚集索引并不是一种单独的索引类型,而是一种数据存储方式,Innode的聚集索引实际上是将主键(PRIMARY kEY )与数据行存放在同一个文件的,一张表只能有一个聚集索引。InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会用一个唯一且不为空的索引列做为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键。

INNODB的普通索引(二级索引)的叶子节点中存放的是PRIMARY KEY的值,所以需要先查询普通索引(二级索引)的叶子节点找到对应的主键值,然后再根据主键值去聚集索引中查询到对应的数据。

InnoDB将主键与数据聚集在一起的方式,使得按主键顺序的插入和查询效率会很高,更新主键或者不按主键的顺序插入数据的代价会比较高,所以主键的选取很重要(使用AUTO INCREMENT字段或者程序自己生成的顺序字段要比无序的UUID好的多) 二级索引会保存主键的值,所以主键的值不要太大。

非聚集索引非聚集索引的索引与数据是存在在不同文件的,对于MyISAM引擎的一张表,会有三种文件,FRM(表结构)、MYD(数据,就是数据库中的每个行)、MYI(索引)。 MySQl使用索引查询数据时,先到MYI文件中找出数据存储的位置指针,然后再到MYD文件中读取数据。MyISAM中主键索引和其他索引在结构上没有什么不同,主键索引就是一个名为PRIMARY的唯一非空索引。

索引操作

创建在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。

  • CREATE TABLE

    hell

    `

  • ALTER TABLE
    ALTER TABLE table_name ADD INDEX|KEY index_name (column1,[column2]...)
    ALTER TABLE table_name ADD UNIQUE [KEY|INDEX] (column1,[column2]...)
    ALTER TABLE table_name ADD PRIMARY KEY|INDEX (column1,[column2]...)

    `

  • CREATE INDEX
    CREATE KEY|INDEX index_name ON table_name (column_list)
    CREATE UNIQUE KEY|INDEX index_name ON table_name (column_list)

    ` 删除

查看 SHOW INDEX FROM

tableName

高效索引策略

参考文献

MySQL索引背后的数据结构及算法原理 MYSQL-索引 Mysql索引分析

http://www.tuicool.com/articles/zmiM3mB

时间: 2024-10-27 19:32:32

MySQL索引详解的相关文章

mysql索引详解,摘自《MySQL 5权威指南》

本文介绍了数据库索引,及其优.缺点.针对MySQL索引的特点.应用进行了详细的描述.分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用.本文摘自<MySQL 5权威指南>(3rd)的8.9节.(2007.07.05最后更新)        索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.注:[1]索引不是万能的!索引可以加快数据检索操作,但会使数据修改操作变慢.每修改数据记录,索引

mysql 索引 详解

索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable表: CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  );   我们随机向里面插入了10000条记录,其中有一条:5555, admin. 在查找username="admin"的记录

MySQL 索引详解大全

1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 2. 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可. 索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度索引的优点是可以提高检索数据的速度索引的缺点是创建和维护索引需要耗费时间索引可以提高查询速度,会减慢写入速度 索引分类 1.普通索引    2.唯一索引  

最全面的 MySQL 索引详解

本文章来自 http://www.codeceo.com/article/mysql-index-2.html 什么是索引? 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 2.索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可. 索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度索引的优点是可以提高检索数据的速

Mysql索引详解及优化(key和index区别)

MySQL索引的概念 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了:聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快 要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件.对于一个经常需要更新和插入的表格,就没有必要为

Mysql学习总结(30)——MySQL 索引详解大全

什么是索引? 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可. 索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度 索引的优点是可以提高检索数据的速度 索引的缺点是创建和维护索引需要耗费时间 索引可以提高查询速度,会减慢写入速度 索引分类 1.普通索引 2.唯一

mysql 索引详解

mysql 联合索引详解

mysql 联合索引详解   联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效. 两个或更多个列上的索引被称作复合索引.利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引.复合索引的结构与电话簿类似,人名由

MySQL 数据类型 详解

MySQL 数据类型 详解 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补. 1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3个字节 范围(-8388608~83