MySQL索引的设计和使用
Posted TooLateToLearn!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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索引。
以上是关于MySQL索引的设计和使用的主要内容,如果未能解决你的问题,请参考以下文章