mysql索引

1.常用索引模型。

  1.1 hash表

    哈希表结构适合于 等值查询场景。  链表结构,非有序。

  1.2 有序数据

    有序数组,在等值查询和范围查询场景中的性能都十分优秀。

    有序数组索引查询只适合静态存储引擎。

    缺点:更新数据的成本高。   为了保证有序

  1.3 搜素树        Innodb的索引模型

    二叉树:效率高,但是实际中绝大多数数据库都不会用,因为树高。索引不止要存储在内存中,还要写盘,从磁盘上读取一个数据快需要大约10ms的寻址时间。

    多叉树:

      在innodb中,表都是根据主键顺序以索引的形式存放,这种存储方式的表称为索引组织表。

      innodb使用了B+树索引模型,所有数据都存在B+树中。

2. 索引

  创建一个表:id为主键 k 上与索引

mysql> create table T(

id int primary key,

k int not null,

       s varchar(100) NOT NULL DEFAULT ‘‘,

index (k))engine=InnoDB;

  1. insert into T values(100,1, ‘aa‘),(200,2,‘bb‘),(300,3,‘cc‘),(500,5,‘ee‘),(600,6,‘ff‘),(700,7,‘gg‘);
     
    表中 R1~R5 的(ID,k)值分别为(100,1)、(200,2)、(300,3)、(500,5)和(600,6),两棵树的示例示意
  2. mysql索引
  • 主键索引和非主键索引:
  • 1.主键索引的叶子节点存储的是整行数据。在innoDB中,主键索引是一种聚簇索引(clustered index)
    2.非主键索引的叶子节点存储的是主键键值。在innoDB中,非主键索引也成为二级索引(secondary index)
    3.主键索引 与 非主键索引 查询的区别:
      主键索引 查询的方式只需要 搜索id 这颗 B+树。
      普通索引 查询,先查询普通索引树,得到对应的主键id,再用id索引树搜索一次。这个过程我们称之为回表
    4.索引的维护
    如果数据不是自增序列,可能再插入数据之后造成-页分裂-使原本放在一页的数据分到2个页中,整体空间利用率下降50%。

  

  常用的索引

    1.覆盖索引:

      如果查询sql  

        select *from T where k between 3 and 5;   
          此时需要因为要去拿 T表的所有字段,所以需要回表。 有什么方法 优化呢,此时就可以引入覆盖索引。
        select ID from T where k between 3 and 5;
          此时我们只需要 获取对应的id,而id已经在k的索引树上了,所以不需要回表。
 
    由于覆盖索引可以减少搜索树搜索次数,所以对sql的性能有显著的提高,故 覆盖索引是一种常见且重要的优化手段。
    所以,我们常以联合索引的方式构建索引。
 
    2. 最左前缀原则。
      在一些不频繁 但是我们又不想做全表访问的查询。
      B+树这种索引,我们经常利用 【最左前缀】,来定位记录。
      不要定义索引的全部定义,只需要满足索引的前 N个字符,就可以利用索引加速检索。
 
    因为联合索引支持 最左前缀,所以我们可以通过 调整 联合索引的顺序 减少索引树的创建,有利与提升 新增/更新 时的性能。
    例如创建联合索引(a,b) 此时就不需要创建所以(a)
    
    索引创建的第一原则:如果可以通过调整联合索引的顺序,而达到少创建索引的目的,那么这个顺序我们往往 优先使用。
 
    3. 下推索引
      在索引查询的便利过程中 例如查询:  
      select * from tuser where name like ‘王%‘ and age=18 and ismale=1; 
 
      此时想查询姓 王/十八岁/男性 
      Mysq5.6只能从age = 18 开始一个一个回表,找到主键索引上的数据,再做字段比较。
      Mysql5.6之后引入了索引下推,可以再索引遍历的过程中,对索引包含的字段进行判断,直接过滤掉不满足的数据,减少回表次数。
    
        

      

 

mysql索引

上一篇:MySQL优化——SQL优化


下一篇:Lamdba表达式