zoukankan      html  css  js  c++  java
  • 2.MySQL中的索引

      索引就像树的目录,是为了更快的找到所要找的内容(数据)。MySQL中,索引是在存储引擎层实现的,不同的存储引擎有不同的索引模型,如innodb是采用的是B+树的索引模型,本篇主要以innodb存储引擎的索引模型来讲解索引知识。

     1.innodb存储引擎的索引模型

      在innodb中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表,而innodb的索引模型是B+树,所以数据都存储在B+树上。

      每一个索引在innodb里面都对应一颗B+树,根据树的叶子节点的不同,索引分为主键索引(存的是整行数据)和非主键索引(叶子节点为主键),其中主键索引又称为聚簇索引,非主键索引称为二级索引。

      主键的长度越小,普通索引的叶子节点所占的空间就越少,从这个角度来说用自增主键对索引维护的代价要小很多。那在什么业务场景下可以用业务字段做索引呢,如下场景:

       a. 只有一个索引 ;b. 这个索引必须是唯一索引。这样就不用考虑其他索引的叶子节点的大小问题。

     2. 覆盖索引  

    mysql> create table T (
    ID int primary key,
    k int NOT NULL DEFAULT 0, 
    s varchar(16) NOT NULL DEFAULT '',
    index k(k))
    engine=InnoDB;
    
    insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg');

      当执行查询语句 select * from T where k between (3,5);时mysql会先在 k 索引树上查找满足3 到 5 范围内叶子节点(即主键ID 100、500),然后到主键索引树上查找满足条件的行,这个查找过程称为回表。

      如果执行查询语句 select ID from T where k between (3,5);时,则在 k 索引树上即可查到满足条件的ID的值,而避免了回表,这种通过索引查询条件的结果即可“覆盖”查询需求称为覆盖索引,可见覆盖索引也是优化sql的一种很好的手段。

     3.最左前缀原则

      索引的维护也是需要成本的,因为有最左前缀原则,当建立一个联合索引(name,age)时,一般就不用单独建立name索引了。

      

      

  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/11016338.html
Copyright © 2011-2022 走看看