mysql 索引

来源:互联网 发布:淘宝正品运动鞋货源 编辑:程序博客网 时间:2024/06/01 19:32

索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,目录是要占纸张的,而索引是要占磁盘空间的

二、Mysql常见索引数据结构
1、FULLTEXT(全文索引)
1)、目前只有MyIsam引擎支持
2)、目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引
3)、可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用
4)、其出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题而进行遍历数据表
5)、列举其中一种创建方式
ALTER TABLE table ADD INDEX `FULLINDEX` USING FULLTEXT(`cname1`[,cname2…]);
使用SELECT * FROM table WHERE MATCH(cname1[,cname2…]) AGAINST ('word' MODE );
其中, MODE为搜寻方式(IN BOOLEAN MODE ,IN NATURAL LANGUAGE MODE ,IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION)

2、HASH
2.1、优点
1)、Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引

2.2、限制和弊端
虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些
1)、它不支持范围查找和排序等功能.仅仅能满足"=","IN"和"<=>"查询
=>由于是hash结构,每个键只对应一个值,并且是散列的方式分布,而Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。 

2)、Hash 索引无法被用来避免数据的排序操作
=>由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算

3)、Hash 索引不能利用部分索引键查询 
=>对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用

4)、Hash 索引在任何时候都不能避免表扫描
=>Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果

5)、Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高
=>对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下

3、B+树
1)、b+tree是mysql使用最频繁的一个索引数据结构,数据结构以平衡树的形式来组织,因为是树型结构,所以更适合用来处理排序,范围查找等功能.
2)、相对hash索引,B+树在查找单条记录的速度虽然比不上hash索引,但更适合排序等操作
3)、除了 Archive 存储引擎之外的其他所有的存储引擎都支持 B-Tree 索引

三、MyISAM和Innodb中索引的区别
1、两者的索引都是基于B+树!
2、MyISAM 存储引擎的索引和 Innodb 的 Secondary Index 的存储结构也基本相同

在MyISAM里
1)、B+树的数据结构Leaf Nodes中存储的内容实际上是实际数据的地址值。
通过实际数据的地址值直接定位到 MyISAM 数据文件中相应的数据行的信息
也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。
这种索引的模式被称为非聚集索引

2)、表可以没有主键

2)、主键索引和非主键索引差别很小,只不过是主键索引的索引键是一个唯一且非空的键而已。

在Innodb里
1)、B+树的数据结构中存储的都是实际的数据,这种索引有被称为聚集索引
与MyISAM的两个重点区别:
一是primary key形态索引,这个索引的key是数据表的主键,因此InnoDB的数据文件本身就是索引文件,同时其leaf node里存放的是完整实际数据记录,不仅存放了索引键的数据,还存放了其他字段的数据。
二是secondary index形态索引,其leaf node存储相应记录主键的值而不是地址。InnoDB的所有辅助索引都引用主键作为data域

2)、表必须要有主键

四、Mysql索引分类

索引:是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针
主键:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建

主键索引:它 是一种特殊的唯一索引,不允许有空值。分为复合主键和联合主键
复合主键:复合主键就是指你表的主键含有一个以上的字段组成 
联合主键:主键A跟主键B形成的联合主键是唯一

普通索引:最基本的索引,没有任何限制,允许被索引的数据列包含重复的值
唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。 
全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。

优缺点:
索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件
建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快
索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句

原创粉丝点击