Python基础学习(41) 索引的原理 索引的具体操作

Python基础学习(41) 索引的原理 索引的具体操作

一、今日内容

  • 索引的原理
  • 索引的具体操作

二、索引的原理

MySQL的索引本质上是利用B+树来实现,用以加快查询速度;关于B+树的介绍,网上相关的介绍很多。如:https://www.cnblogs.com/tiancai/p/9024351.html,等;

三、索引的具体操作

  1. 聚集索引和非聚集索引

    • 聚集索引(聚簇索引):将所有数据统一存放,InnoDB 有且必须有;
    • 非聚集索引(非聚簇索引、辅助索引):MyISAM和InnoDB都可以有且有多个;

    在InnoDB存储引擎中,主键会默认创建一个聚集索引,所以根据主键条件查询速度会更快;MyISAM只存在非聚集索引;聚集索引和非聚集索引的工作方式见:https://my.oschina.net/xiaoyoung/blog/3046779;

  2. 磁盘的预读性原理

    每一次读取硬盘的数据块都是固定的,如Linux每一次读取4096byte,称为一个block块;

  3. 索引的创建与删除

    • 创建主键会primary key同时创建聚集索引;
    • 创建唯一约束unique会同时创建辅助索引;
    • 添加一个索引:create index <Index> on <Table>(<Key>);

    添加索引的情况:

    • 创建表时;
    • create index <Index> on <Table>(<Key>);
    • alter table <Table> add index <Index>(<Key>);
  4. 正确使用索引

    • 查询的条件字段不是索引字段:对哪个字段创建了索引,就尽量使用这个字段作为条件查询;
    • 在创建索引的时候应该对区分度较大的列进行创建,1/10以下的重复率比较适合;
    • 范围越大越慢,范围越小越快;
    • like 'a%'速度块,like '%a'速度慢;
    • and较快,or较慢;
  5. 联合索引

    联合索引遵守最左前缀原则,如(id, name, email)只有命中了联合索引的最左前缀索引才能发挥作用,从出现范围开始索引失效;

  6. 注意事项

    • 避免使用select * ;
    • 使用count(*)
    • 创建表时尽量使用char来代替varchar
    • 表的字段顺序,固定长度的字段优先;
    • 组合索引代替多个单列索引;
    • 尽量使用短索引;
    • 使用连接来代替子查询;
    • 连表时注意条件类型需一致;
    • 索引散列值(重复少)不适合作为索引;
原文地址:https://www.cnblogs.com/raygor/p/13867157.html