MySQL索引的设计和使用

一. 索引概述

MyISAM和InnoDB存储引擎的表默认创建的都是BTREE索引。MySQL目前还不支持函数索引(5.7版本开始支持),但支持前缀索引,即对索引字段的前N个字符创建索引。前缀索引的长度和存储引擎相关,对于MyISAM存储引擎的表,索引的前缀长度可以达到1000字节长,而对于InnoDB存储引擎的表,索引的前缀长度最长是767字节。请注意前缀的限制应以字节为单位进行测量,而create table语句中的前缀长度解释为字符数。在为使用多字节字符集的列指定前缀长度时一定要加以考虑。

MySQL中还支持全文本(FULLTEXT)索引,该索引可以用于全文搜索。索引总是对整个列进行的,不支持局部(前缀)索引。

全文索引更多信息:

http://www.cnblogs.com/tommy-huang/p/4483684.html

http://blog.csdn.net/bbirdsky/article/details/45368897

 

 

默认情况下,MEMORY存储引擎使用HASH索引,但也支持BTREE引擎。

空间类索引相关信息

索引在创建表的时候可以同时创建,也可以随时增加新的索引。创建新索引的语法为:

create [unique | fulltext | spatial] index index_name

[using index_type]

on tb1_name(index_col_name, ...)

index_col_name:

  col_name[(length)] [asc | desc]            //前缀索引

为city表创建10个字节的前缀索引:

 

索引的删除语法:

drop index index_name on tb_name;

 


二. 设计索引的原则


三. BTREE索引与HASH索引

HASH索引的重要特征:

  • 只用于=或者<=>操作符的等式比较
  • 优化器不能使用HASH索引来加速ORDER BY操作
  • MySQL不能确定在两个值之间大约有多少行。如果将一个MyISAM表改为HASH索引的MEMORY表,会影响一些查询的执行效率。
  • 只能使用整个关键字来搜索一行。

而对于BTREE索引,当使用<、>、>=、<=、BETWEEN、!=或者<>,或者LIKE ‘pattern’(其中‘pattern’不以通配符开头)操作符,都可以使用相关列上的索引。

 

如果没有索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关记录的行,使用索引可以显著的加快速度。注意如果需要访问大部分行,顺序读取要快得多,因为此时应避免磁盘搜索

 

大多数MySQL索引(如PRIMARY KEY、UNIQUE、INDEX和FULLTEXT等)在BTREE中存储。只是空间列类型的索引使用RTREE,并且MEMORY表还支持HASH索引。

posted @ 2017-07-06 22:49  TooLateToLearn!  阅读(197)  评论(0编辑  收藏  举报