mysql索引当中的几个概念和原理
2014-10-16 21:51
148 查看
索引是什么东西我就不在说了。在mysql中索引是在存储引擎中实现的,索引并没有统一的标准,本文主要介绍在innodb和mysiam上的索引,也就是B+树索引。
mysiam使用前缀压缩可以是索引变得很小,innodb则按照原数据进行存错。B+树索引意味着所有的数据都是按照顺序存错的,并且每个叶子节点到根节点的距离相同。
由于b+树的一些性质,因此索引也有一些注意事项和特点:
1,匹配列前缀,举个例子吧:
select name from user where name = 'dong%';
这种情况下是可以用到索引的,
但是,
select name from user where name = '%'dong;
这种情况就用不到索引
2,不要在索引列上进行计算:
select * from user where id + 1;
聚簇索引:
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于其实现方式,但是innodb的聚簇索引实际是在同一个结构中保存了索引和数据行。但是由于无法把数据行存放在两个不同的地方,索引一个表只能有一个聚簇索引,innodb会吧主键索引当做聚簇索引。
下图展示了聚簇索引的结构,一个典型的b+树
聚簇索引的有点:可以最大限度的提高io性能,因为只需要根据索引列进行查询到结果后就可以得到此行上的全部数据,不过对于innodb来说意味着只能通过主键查找才能获得这样的优势。
聚簇索引的缺点:索引的更新操作的代价会很大,由于聚簇索引指向整个块的数据,数据量较大,如果需要移动那么代价自然就会比较高;二级索引(非聚簇索引)由于叶子节点指向的是主键,索引需要二次索引查询,但是对于innodb,通过自适应hash索引可以减少这样的工作。
注:innodb引擎的二级索引中储存了主键ID,事务ID,回滚指针,非主键ID。
innodb和myisam的数据插入过程:
innodb因为一定会应用到主键,而且又用到是聚簇索引,因此插入的话索引和数据直接关系到表的物理结构。因此如果直接不是按照顺序插入的话,会有大量的数据更新,移动的情况出现,因此会比较慢;
myisam在插入过程中没插入一行会在行上加上行号,在无聊上是按照顺序插入的,而在这其中建立索引的过程也就是人叶子节点指向行号,因此会很快。
上面的两个过程也就解释了为什么myisam的导入数据的速度比innodb快很多。
覆盖索引:(感觉概念还是有点太麻烦,用一个例子解释一下)
table1中有id ,name,address字段,其中name上面建立了索引,如下sql
select address from table1 where name = ‘dong’;
这种查询和索引看似已经最优了,其实还可以通过覆盖索引来达到更优:
建立索引create INDEX name (name, address);
其实这样解释了需要那个列的字段就select那个列的字段。
mysiam使用前缀压缩可以是索引变得很小,innodb则按照原数据进行存错。B+树索引意味着所有的数据都是按照顺序存错的,并且每个叶子节点到根节点的距离相同。
由于b+树的一些性质,因此索引也有一些注意事项和特点:
1,匹配列前缀,举个例子吧:
select name from user where name = 'dong%';
这种情况下是可以用到索引的,
但是,
select name from user where name = '%'dong;
这种情况就用不到索引
2,不要在索引列上进行计算:
select * from user where id + 1;
聚簇索引:
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于其实现方式,但是innodb的聚簇索引实际是在同一个结构中保存了索引和数据行。但是由于无法把数据行存放在两个不同的地方,索引一个表只能有一个聚簇索引,innodb会吧主键索引当做聚簇索引。
下图展示了聚簇索引的结构,一个典型的b+树
聚簇索引的有点:可以最大限度的提高io性能,因为只需要根据索引列进行查询到结果后就可以得到此行上的全部数据,不过对于innodb来说意味着只能通过主键查找才能获得这样的优势。
聚簇索引的缺点:索引的更新操作的代价会很大,由于聚簇索引指向整个块的数据,数据量较大,如果需要移动那么代价自然就会比较高;二级索引(非聚簇索引)由于叶子节点指向的是主键,索引需要二次索引查询,但是对于innodb,通过自适应hash索引可以减少这样的工作。
注:innodb引擎的二级索引中储存了主键ID,事务ID,回滚指针,非主键ID。
innodb和myisam的数据插入过程:
innodb因为一定会应用到主键,而且又用到是聚簇索引,因此插入的话索引和数据直接关系到表的物理结构。因此如果直接不是按照顺序插入的话,会有大量的数据更新,移动的情况出现,因此会比较慢;
myisam在插入过程中没插入一行会在行上加上行号,在无聊上是按照顺序插入的,而在这其中建立索引的过程也就是人叶子节点指向行号,因此会很快。
上面的两个过程也就解释了为什么myisam的导入数据的速度比innodb快很多。
覆盖索引:(感觉概念还是有点太麻烦,用一个例子解释一下)
table1中有id ,name,address字段,其中name上面建立了索引,如下sql
select address from table1 where name = ‘dong’;
这种查询和索引看似已经最优了,其实还可以通过覆盖索引来达到更优:
建立索引create INDEX name (name, address);
其实这样解释了需要那个列的字段就select那个列的字段。
相关文章推荐
- MySQL的几个概念:主键,外键,索引,唯一索引
- MySQL的几个概念:主键,外键,索引,唯一索引
- MySQL的几个概念:主键,外键,索引,唯一索引
- MySQL的几个概念:主键,外键,索引,唯一索引
- MySQL的几个概念:主键,外键,索引,唯一索引
- MySQL的几个概念:主键,外键,索引,唯一索引
- MySQL的几个概念:主键,外键,索引,唯一索引
- MySQL的几个概念:主键,外键,索引,唯一索引
- MySQL索引原理及慢查询优化与建索引几个原则
- MySQL的几个概念:主键,外键,索引,唯一索引
- MySQL的几个概念:主键,外键,索引,唯一索引
- MySQL的几个概念:主键,外键,索引,唯一索引
- MySQL的几个概念:主键,外键,索引,唯一索引
- 仿基因编程原理导论(里面的几个重要的概念正在做修正,所以这只能算是一个原理的初稿。)
- 【转】MySQL索引背后的数据结构及算法原理
- MySQL索引背后的数据结构及算法原理
- MySQL索引背后的数据结构及算法原理(b+树)
- MySQL索引背后的数据结构及算法原理
- 数据库的几个概念:主键,外键,索引,唯一索引
- 【转载】T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他