Python基础学习(41) 索引的原理 索引的具体操作
Python基础学习(41) 索引的原理 索引的具体操作
一、今日内容
- 索引的原理
- 索引的具体操作
二、索引的原理
MySQL的索引本质上是利用B+树来实现,用以加快查询速度;关于B+树的介绍,网上相关的介绍很多。如:https://www.cnblogs.com/tiancai/p/9024351.html,等;
三、索引的具体操作
-
聚集索引和非聚集索引
- 聚集索引(聚簇索引):将所有数据统一存放,InnoDB 有且必须有;
- 非聚集索引(非聚簇索引、辅助索引):MyISAM和InnoDB都可以有且有多个;
在InnoDB存储引擎中,主键会默认创建一个聚集索引,所以根据主键条件查询速度会更快;MyISAM只存在非聚集索引;聚集索引和非聚集索引的工作方式见:https://my.oschina.net/xiaoyoung/blog/3046779;
-
磁盘的预读性原理
每一次读取硬盘的数据块都是固定的,如Linux每一次读取4096byte,称为一个block块;
-
索引的创建与删除
- 创建主键会
primary key
同时创建聚集索引; - 创建唯一约束
unique
会同时创建辅助索引; - 添加一个索引:
create index <Index> on <Table>(<Key>);
添加索引的情况:
- 创建表时;
create index <Index> on <Table>(<Key>);
alter table <Table> add index <Index>(<Key>);
- 创建主键会
-
正确使用索引
- 查询的条件字段不是索引字段:对哪个字段创建了索引,就尽量使用这个字段作为条件查询;
- 在创建索引的时候应该对区分度较大的列进行创建,1/10以下的重复率比较适合;
- 范围越大越慢,范围越小越快;
like 'a%'
速度块,like '%a'
速度慢;and
较快,or
较慢;
-
联合索引
联合索引遵守最左前缀原则,如
(id, name, email)
只有命中了联合索引的最左前缀索引才能发挥作用,从出现范围开始索引失效; -
注意事项
- 避免使用
select *
; - 使用
count(*)
; - 创建表时尽量使用
char
来代替varchar
; - 表的字段顺序,固定长度的字段优先;
- 组合索引代替多个单列索引;
- 尽量使用短索引;
- 使用连接来代替子查询;
- 连表时注意条件类型需一致;
- 索引散列值(重复少)不适合作为索引;
- 避免使用