10.索引的设计和使用
10.1 索引概述
BTREE索引:Mysql(MyIASM和Innodb)默认的索引类型。
前缀索引:对索引字段的前N个字符创建索引。N的最大取值和存储引擎有关,MyIASM支持最大前缀长度为1000字节,Innodb引擎支持最大前缀长度为767字节。
全文索引:可用于全文搜索。仅有MyIASM支持全文索引,且只限于CHAR、VARCHAR、Text类型的列。
空间类型索引:仅有MyIASM支持空间类型索引,索引列必须为非空。
HASH索引:仅有MEMORY支持HASH索引。
创建索引语法:
create [unique | fulltext | spatial] index index_name [using index_type] on table_name (col_name[(length)] [ASC|DESC]);
说明:
index_type取值为BTREE、RTRE、Hash
例子:
create index idx_emp_ename on emp (ename(5));
分析查询语句,检查是否使用了索引:
explain select * from emp where ename='SCOTT';
删除索引语法:
drop index index_name on table_name;
例子:
drop index idx_emp_ename on emp;
10.2 设计索引的原则
最适合索引的列是出现在where子句中的列,或连接子句中指定的列,而不是出现在select关键字后的选择列表中的列;
考虑某列中值的分布,索引的列的基数越大,索引的效果越好;
使用短索引,对字符串索引时应该指定一个前缀长度,即前N个字符就能大致区分唯一纪录时,避免对整列添加索引。
复合索引,选择合适的最左前缀列;
不要过度索引,索引会占用额外的磁盘空间,并降低DML性能。
Innodb引擎的表记录按主键顺序保存,应该给表尽量指定主键,主键列要选择较短的数据类型,其它非主键索引会保存主键列。
10.3 Btree索引和Hash索引
Hash索引只能用于等值比较(=,<=>),不能用于范围比较(>,<,>=,<=,!=,<>,between...and,like),不能用于排序操作(order by),只能使用整个关键字来搜索一行。
Btree索引可用于等值比较和范围比较(>,<,>=,<=,!=,<>,between...and,like)。
MEMORY引擎表默认创建Hash索引,在范围比较时应创建Btree索引。
10.4 小结
索引用于快速找出特定的行,不是用索引时将顺序扫描所有的行;
如果条件列有索引,将根据条件值在索引中查找记录主键,根据主键在数据中访问特定的行;
如果需要访问表中很大一部分行(20%),顺序读取将比索引扫描更快,索引不起效。
Mysql类型分为BTREE索引、RTREE索引、Hash索引;
其中:主键索引、唯一键索引、全文索引、普通索引都是BTREE索引,空间索引是RTREE索引。