mysql 聚集索引,非聚集索引,覆盖索引区别。

把原站信息经过筛选贴过来,用于自己备忘。原站:https://www.cnblogs.com/aspwebchh/p/6652855.html

--------------------------------mysql执行计划关键字: explain----------------------------------------

聚集索引:

给表上了主键,那么表在内存上的由整齐排列的结构转变成了树状结构,也就是「平衡树」结构,换句话说,就是整个表就变成了一个索引。没错, 再说一遍, 整个表变成了一个索引,也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。

非聚集索引:

非聚集索引和聚集索引一样, 同样是采用平衡树作为索引的数据结构。索引树结构中各节点的值来自于表中的索引字段, 假如给user表的name字段加上索引 , 那么索引就是由name字段中的值构成,在数据改变时, DBMS需要一直维护索引结构的正确性。如果给表中多个字段加上索引 , 那么就会出现多个独立的索引结构,每个索引(非聚集索引)互相之间不存在关联。

区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据。

覆盖索引:

如果一个索引包含所有需要查询的字段的值,我们就称之为“覆盖索引”。因此不需要通过主键ID值的查找数据行的真实所在, 直接取得叶节点中name的值返回即可。

个人理解:

非聚集索引就是一般常用的索引,索引树的根节点是表的主键。

聚集索引就是主键组成的树,根节点是数据库真实数据的位置。

另外知识点:

许多数据库的文档会告诉读者:聚集索引按照顺序物理的存储数据到磁盘。但是试想下,如果聚集索引必须按照特定顺序存放物理记录,则维护成本显得非常高。所以,聚集索引的磁盘存储并不是物理上连续的,而是逻辑上连续。

(具体参考评论区,这样一直一直走 )

--------------------------------------------------------------------------

mysql开启了ICP的话,可以减少存储引擎访问基表的次数

下面来简单的介绍一下这三者的区别

using index :使用覆盖索引的时候就会出现

using where:在查找使用索引的情况下,需要回表去查询所需的数据

using index condition:查找使用了索引,但是需要回表查询数据

using index & using where:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

以上四点就能看出它们之前的区别,或许有部分人都存在疑惑 using index & using where 和using index condition那个比较好,从上面的的解释中就能看出是前者比较好,毕竟不需要回表查询数据,效率上应该比较快的

posted @ 2019-06-14 11:03  菜鸡徐思  阅读(3441)  评论(4编辑  收藏  举报