索引(Index)是帮助mysql高效获取数据的数据结构。对于高性能非常关键。
索引的重要性主要体现在数据量非常大的时候。规模小,负载轻的数据库即使没有索引也可以获到好的查询效果
例如:
1 mysql>select first_name from actor where actor_id=5;
改索引列位于actor_id列,因此mysql会使用索引找到actor_id为5的行。
索引有很多种类型,各自有各自的特点。索引实在存储引擎层实现的,而不是服务器层。
(1)、B-Tree索引
谈论引擎多半指的是B-Tree引擎。大部分的存储引擎都支持此种索引
MYSQL存储引擎使用不同的方式把索引保存到磁盘上,他们会影响性能。例如,MyISAM使用前缀压缩来减小索引,而Innodb不会使用压缩索引,因为它不能把压缩索引用于某些优化。同样,MyISAM索引按照存储的物理位置引用被索引的行。但是Innodb按照主键引用行。
B-Tree索引通常意味着数据存储是有序的。并且每个叶子页到根的距离是一样的。
B-Tree索引加速了数据访问,因为存储引擎不会扫描整个表得到需要的数据。从根节点开始,根节点保存了指向子节点的指针,并且存储引擎会根据指针寻找数据。
(2)哈希索引
该索引时建立在哈希表的基础上,它只对使用了索引中的每一列的精确查找有用。在mysql中只有memory存储引擎支持哈希索引。
哈希本身只是保存了简单的哈希值,哈希索引显得非常紧凑。哈希值的长度不会依赖索引的列。tinyint列的哈希索引和大型字符列的哈希索引大小是一样的
哈希索引的限制:
mysql不可以通过哈希索引排序,因为不会按序保存行
哈希索引只支持使用了= 、in()和<=>的相等比较。
哈希索引只是包含了哈希码和行指针,而不是本身,mysql不能使用索引中的值来避免读取行
访问哈希索引速度非常快,除非碰撞率很高。当发生碰撞的时候存储引擎必须访问链表中的每一个行指针,然后逐行进行数据的比较,以确定正确的数值。
(3)R-Tree索引(空间索引)
MyISAM支持空间索引。可以使用如Geospatial这样的地理空间数据类型。和B-Tree不同的是空间索引不会要求WHERE字句使用索引的最左前端。它同时全放位的索引了数据。
(4)全文索引(FULLTEXT)
这是MyISAM的一种特殊的索引。它从文本中找到关键字,而不是直接和索引中的值进行比较。全文搜索和其他匹配类型完全不同。