一 Innodb
1. 简介
索引是一种排好序的用于快速查找的数据结构。
**根据官网手册InnoDB支持B-tree索引、聚簇索引(Clustered indexes)、全文索引(Full-text search indexes)、不支持hash索引(InnoDB在内部利用哈希索引来实现其自适应哈希索引功能)、不支持T-tree索引。**Geospatial indexing support(坐标索引支持),支持索引缓存;
支持外键、支持事务。锁粒度是行锁。
2.聚簇索引
注:与myisam不同的是,Innodb叶子节点保存的是所有的数据。
每个Innodb表都有一个特殊的索引被称作聚簇索引,它存储了一行的数据。主键可以看做是索引的同义词,InnoDB会使用聚簇索引对DML操作进行优化:
- 在表上定义主键时,Innodb将其作为聚簇索引;
- 如果没有定义主键,MySQL将找到第一个UNIQUE索引,其中所有键列都是NOT NULL,而InnoDB将它用作聚簇索引。
- 如果没有主键,也没有合适的索引。Innodb将使用行ID值生成列名为GEN_CLUST_INDEX的隐藏聚簇索引。它是一个6字节的字段,在插入新行时,单调增加。因此物理存储顺序就是其插入的顺序。
通过聚簇索引查找是很快的,因为索引直接指向包含所有数据的页。
3.辅助索引
除了聚簇索引之外,其它都被称为辅助索引(Secondary Indexes)。辅助索引中的每条记录都包含了一行的主键列及辅助索引指定的列。Innodb使用主键值搜索在聚簇索引中的某一行的值。因此有一个短的主键是更有利的。
4.索引的物理结构
除空间索引外,InnoDB索引是B-tree数据结构。 空间索引使用R-trees,R-trees是用于索引多维数据的专用数据结构。 索引记录存储在其B-tree或R-tree数据结构的叶子页中。 索引页的默认大小为16KB。
Innodb会剩下1/16的页空间,如果记录是顺序插入,索引页会利用15/16;如果是随机插入,会利用1/2到15/16。
通过设置MERGE_THRESHOLD,该值表示当页面的利用率降低到该值及以下时,会进行页面合并,节省空间。默认是50%。
也能通过设置innodb_page_size来设置页面大小。
5.排序索引构建
InnoDB执行批量加载,而不是在创建或重建索引时一次插入一个索引记录。 这种索引创建方法也称为排序索引构建(Sorted Index Builds)。 空间索引不支持排序索引构建。全文索引支持排序索引。
在排序索引构建构建期间,redo日志被禁用,但会设置一个检查点确保索引构建能忍受宕机或失败。
6.全文索引
InnoDB 全文索引(FULLTEXT)是一种倒排索引(inverted index),它储存单词列表,并为每个单词储存出现的文档列表。
具体倒排索引介绍可以查看文章:正排索引和倒排索引;
二 myisam引擎
1.索引
myisam支持B-tree索引、支持全文索引 (Full-text search indexes)、坐标索引支持 (Geospatial indexing support)、不支持聚簇索引、不支持hash索引、不支持T-tree索引。
另不支持外键、不支持事务。锁粒度是表锁。存储限制是256TB。
MyISAM表有以下特征:
- MyISAM表的最大索引数量是64,每个索引最多16列;
- BLOB and TEXT能被索引;
- 索引列中允许使用NULL值。 每个key需要0到1个字节。
每个myisam表存储为两个文件,数据文件以.MYD结尾,还有一个索引文件以.MYI结尾。由此可见MyISAM与Innodb的索引并不一样,myisam的主索引和辅助索引结构上一样,它们的叶子节点都存储着某条记录的位置,而并不存储数据。
2. MyISAM表存储格式
MyISAM支持三种不同的存储格式 ,固定格式、动态格式和压缩格式;当表不包含可变长度的列(VARCHAR, VARBINARY, BLOB, or TEXT)时,默认使用固定格式。
三 创建和使用索引注意事项
1. 创建索引的注意事项
- 频繁作为查询条件的字段适合建立索引;
- 查询中与其它表关联的字段,外键关系建立索引;
- 单值和复合索引,优先选择复合索引;
- 查询中排序的字段,排序字段若通过索引去访问将大大提高查询速度;
- 查询中统计或者分组字段要建立索引;
- where条件里用不到的字段不创建索引;
- 对于单键索引,尽量针对当前查询过滤性好的索引;
- 在选择组合索引的时候,当前查询中过滤性最好的字段在索引字段的顺序中,位置越靠前越好;
- 在选择组合索引的时候,尽量选择可以能够包含当前查询中的where子句中更多字段的索引;
- 尽可能通过分析统计信息和调整查询的写法来达到选择合适索引的目的;
- 频繁更新的字段不要建立索引;
2. 使用索引要注意的事项
- 对于字符串索引,一定要加引号;
- 如果索引了多列,要遵循最佳左前缀原则;
- 不要在索引上做任何操作,会导致索引失效,而转向全表扫描;
- 存储引擎不能使用范围条件右边的列;
- 不等于、or都会使索引失效;