首页 > 技术文章 > 索引的设计和使用

outstandingjie 2017-11-28 17:33 原文

1、索引的概述

  所有mysql列类型都可以被索引,对相关列使用索引是提高 SELECT 操作性能的最佳途径。 

  每种存储引擎(如 MyISAM、 InnoDB、BDB、MEMORY 等)对每个表至少支持 16 个索引 。

  MyISAM 和 InnoDB 存储引擎的表默认创建的都是 BTREE 索引 。

 

创建索引:create index cityname on city(city(10));

删除索引:drop index cityname on city;

 

2、设计索引的原则

索引的设计可以遵循一些已有的原则,创建索引的时候请尽量考虑符合这些原则,便于 提升索引的使用效率,更高效地使用索引。 

 

搜索的索引列

适合索引的列是出现在where子句中的列,或连接字句中指定的列。

 

使用唯一索引

考虑某列中值的分布。索引的列的基数越大,索引的效果越好。例 如,存放出生日期的列具有不同值,很容易区分各行。而用来记录性别的列,只含有“ M” 和“F”,则对此列进行索引没有多大用处,因为不管搜索哪个值,都会得出大约一半的行。 

 

使用短索引

对字符串索引,应该指定一个前缀长度。

 

利用最左前缀

在创建一个 n 列的索引时,实际是创建了 MySQL 可利用的 n 个索引。 多列索引可起几个索引的作用,因为可利用索引中最左边的列集来匹配行。这样的列集称为 最左前缀。 

 

不要过度索引

额外的索引都要占用额外的磁盘空间,并降低写操作的性能。在修改表的内容时,索引必须进 行更新,有时可能需要重构,因此,索引越多,所花的时间越长。如果有一个索引很少利用 或从不使用,那么会不必要地减缓表的修改速度。此外,MySQL 在生成一个执行计划时, 要考虑各个索引,这也要花费时间。创建多余的索引给查询优化带来了更多的工作。索引太 多,也可能会使 MySQL 选择不到所要使用的最好索引。只保持所需的索引有利于查询优化 

 

3、BTREE索引与HASH索引

MEMORY 存储引擎的表可以选择使用 BTREE 索引或者 HASH 索引,两种不同类型的索引 各有其不同的适用范围。HASH 索引有一些重要的特征需要在使用的时候特别注意,如下所 示。 

  • 只用于使用=或<=>操作符的等式比较。

  •  优化器不能使用 HASH 索引来加速 ORDER BY 操作。

  •  MySQL 不能确定在两个值之间大约有多少行。如果将一个 MyISAM 表改为 HASH索引的 MEMORY 表,会影响一些查询的执行效率。 

  • 只能使用整个关键字来搜索一行  

  

BTREE 索引,当使用>、<、>=、<=、BETWEEN、!=或者<>,或者 LIKE 'pattern'(其

中'pattern'不以通配符开始)操作符时,都可以使用相关列上的索引。

 

索引用于快速找出在某个列中有一特定值的行。如果不使用索引,MySQL 必须从第 1 条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的 列有一个索引,MySQL 能快速到达一个位置去搜寻数据文件的中间,没有必要看所有数据。 如果一个表有 1000 行,这比顺序读取至少快 100 倍。注意如果需要访问大部分行,顺序读 取要快得多,因为此时应避免磁盘搜索。

大多数 MySQL 索引(如 PRIMARY KEY、UNIQUE、INDEX 和 FULLTEXT 等)在 BTREE 中存 储。只是空间列类型的索引使用 RTREE,并且 MEMORY 表还支持 HASH 索引。 

 

推荐阅读