索引的设计和使用
1 索引概述
MySIAM和InnoDB存储引擎的表默认创建的都是BTREE索引,MySQL目前不支持函数索引,但是支持前缀索引。还支持全文本索引,但是只有MySIAM(5.0开始)支持FULLTEXT索引,并只限于CHAR、VARCHAR和TEXT列
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type]
ON tbl_name (index_col_name,...)
index_col_name:col_name [(length)] [ASC|DESC]
删除索引
drop index index_name ON tbl_name
2. 设计索引的原则
1).搜索的索引项,不一定是所要选择的列,换句话说,最适合索引的列是出现在where子句中的列,或者是连接子句中指定的列。
2).使用唯一索引,考虑某列中的值的分布。索引的列的基数越大,索引的效果越好。
3).使用短索引。如果对字符串进行索引,应该指定一个前缀长度,只要有可能就应该这样做。(较小的索引涉及的磁盘IO较少,更为重要的是,对于较短的键值,索引高速缓存中的块能容纳更多的键值)
4).利用最左前缀。在创建一个n列的索引时,实际创建了MySQL可利用的n个索引。多列索引可起几个索引的作用,因为可利用索引最左边的列集来匹配行。
5).不要过度索引。不要以为索引越多越好,每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能。在修改表的内容时,索引必须更新,有时可能需要重构,因此索引越多话费的时间越长。如果一个索引很少利用或从不使用,那么会不必要的减缓表的修改速度。此外,MySQL在生成一个执行计划时,要考虑各个索引,这也需要花费时间。
6).对于InnoDB存储引擎的表,记录默认会按照一定的顺序保存。如果有明确定义的主键,则按照主键的顺序保存。如果没有主键,但是有唯一索引,那么就会按照唯一索引的顺序保存,按照主键或者内部列进行访问时最快的,所以InnoDB表尽量自己指定主键。还需要注意,InnoDB表的普通索引都会保存主键的键值,所以主键要尽可能选择较短的数据类型,可以有地减少索引的磁盘占用,提高索引的缓存效果。
3.BTREE索引与HASH索引
MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引,两种不同类型的索引各有其不同的适应范围。HASH索引有哪些重要的特征需要在使用的时候特别注意:
1)、只用于使用=或<=>操作符的等是比较
2)、优化器不能使用HASH索引来加速ORDER BY操作
3)、MySQL不能确定在两个值之间大约有多少行,将一个MyISAM表改为HASH索引的MEMORY表,会影响一些查询效率。
4)、只能使用整个关键字来搜索一行