索引是数据库中用来提高性能的最常用工具,在MySQL中所有列类型都可以被索引,对相关列使用索引是提高查询操作性能对最佳途径。
MyISAM和InnoDB存储引擎对表默认创建对都是Btree索引,MySQL 目前不支持函数索引,但是支持前缀索引,前缀索引长度和存储引擎有关,对于MyISAM存储引擎的表,索引对前缀长度可以达到1000字节,而InnoDB的是767字节。
MySQL还支持全中文(FullText)索引,该索引可以用来全文搜索。但是当前最新的5.0版本中只有MyISAM引擎支持FullText索引,并且只限于Char、Varchar、和Text类型的列。
默认情况下,Memory存储引擎使用Hash索引,但也支持Btree索引。
创建索引时需要参考一下的原则:
在创建索引时,最适合索引的列是出现在where字句中的列或连接字句中指定的列,而不是查询结果的列;
创建索引时,索引的列应该建立在数据值分布广的字段上即重复性低的字段,比如InnoDB默认的主键索引,一定是唯一索引;
使用短索引,如果要对于一个字符串列进行索引,应该指定一个前缀长度,这样可以节省大量索引空间,使得查询更快,更重要的是对于短的键值,索引高速缓存中的块能容纳更多的键值,因此增加列找到行而不用读取索引中较多块的可能性;
使用最左前前缀,在创建一个聚合索引时,实际上是创建列多个索引,多索引可以起几个索引的作用,因为可以利用索引中的最左的列的列集来进行匹配,这样的列集为最左前缀;
创建索引时需要控制数量,索引并不是越多越好。每个索引都需要使用额外的磁盘空间,并且降低写操作的性能,当数据内容发生变更时,需要更改索引表,因此索引越多,所花费的时间越长;
对于InnoDB存储引擎,MySQL会自动创建主键索引,如果没有主键,但是有唯一索引,那么记录保存时就会按照唯一索引的顺序保存,如果也没有唯一索引,那么表会自动生成一个内部列,按照这个列的顺序保存。
对与Hash索引来讲,hash索引只用于使用=或<=>操作符对等式比较,优化器不能使用hash索引来加速order by操作,只能使用使用整个关键字来搜索一行数据。
当对索引字段进行范围查询时,只有Btree索引可以通过索引访问,而hash索引使用的是全表扫描。