一、概述
所有的MySQL列类型都可以被索引,对相关列使用索引是提高SELECT性能的最佳途径。
根据存储引擎的不同,表的最大索引数和最大索引长度有所不同,每种存储引擎对每个表至少支持16个索引,总索引长度至少为 256字节。
MyISAM和InnoDB 使用 BTREE索引, MEMORY 支持 HASH索引和 BTREE索引。
二、基础知识
常见的索引类型: 主键、普通索引、唯一索引、全文索引。
create index ind_name1 on test11(name1); 为表test11 的 name1列 创建名为 ind_name1的普通索引
show index from test11; 查看 test11表中创建的索引
drop index ind_name1 on test11; 将 test11表中的 名为ind_name1的索引删除
一般为 select 语句的 where 条件涉及的列 创建索引
explain select * from test11 where name1 like '更%'; 使用 explain来查看MySQL的执行计划
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test11
partitions: NULL
type: index
possible_keys: ind_name1 -->可能使用的索引
key: ind_name1 -->实际使用的索引
key_len: 63
ref: NULL
rows: 1 -->扫描的行数
filtered: 100.00
Extra: Using where; Using index
1 row in set, 1 warning (0.00 sec)
三、设计索引的一些原则
1、为 where语句中的条件列 创建索引
2、根据列值的特性,创建唯一索引
3、部分(前缀)索引:对于 字符数较多的列,比如 CHAR(200), 如果 前缀的字符有较高的区分度,则可以 create index ind_ on table(column(20)),为 前20个字符创建 前缀索引。 优点:节省索引空间;较短的索引磁盘IO较少,查询速度更快,比较值也更快;索引缓存中可以容纳更多的值。
4、只保持所需的索引,不要创建过多的索引。
5、InnoDB存储引擎的表,记录默认会按照一定的顺序保存:如果有明确定义的主键,则按照主键顺序保存;没有主键,但有唯一索引,则按照唯一索引的顺序保存;既没有主键又没有唯一索引,那么表中会自动生成一个内部列,按照内部列的顺序保存。
所以,InnoDB表 建表时 需要指定主键,按照主键进行的访问是 最快的。 InnoDB表的普通索引都会保存主键的键值,所以主键要尽可能选择 较短的 数据类型,可以有效减少磁盘占用,提高缓存效果。
四、BTREE索引和 HASH索引
HASH索引的特征:只能用于使用 = 或 <=> 操作符的等式比较;优化器不能使用 HASH索引加速order by操作;MySQL不能确定在两个值之间大约有多少行,会影响查询效率。总的来说,就是 使用索引的条件比较严格。
BTREE索引:当使用 >、<、<=、>=、BETWEEN、!=、<>、LIKE 'pattern%',都可以使用相关列上的索引。