码迷,mamicode.com
首页 > 编程语言 > 详细

Python- 索引

时间:2018-11-27 22:10:01      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:注意   ==   __call__   根据   字段   如何   create   问题   实例   

1.索引
聚集索引
叶子节点整个行中的额数据
辅助索引
叶子节点存储的是索引字段 和主键值
覆盖索引
回表
联合索引

正确使用索引
1.区分度高字段
2.索引的字段数据量应该尽可能小
3.优先使用聚集索引
4.联合索引 创建时 把区分度高放左边
查询时 尽可能使用最左边的索引

索引越多越好?
索引能够提升效率
同时降低了写入速度
增加额外的磁盘占用

2.元类
用于创建类的类 叫元类 默认元类都是type
主要控制类的创建__init__ 类的实例化__call__

3.单例
一个类只有一个实例
什么时候用,大家公用一个打印机,没有必要每个人创建新的打印机对象 共用一个对象即可



===============================
索引
01 为什么要用索引
因为项目运行中,查询操作非常频繁,为了提高用户体验,要提高查询的速度,
如何提高就靠索引(大多数性能问题都是慢查询 提到加速查,就必须用到索引)
作用:
- 约束
- 加速查找

02 什么是索引
搜索引导, 所以是一种单独的,物理的 有序的 存储结构,用于加速查询
例如: 字典 书的目录 车票上的车厢号

索引的本质原理就是通过不断地缩小查询范围,来降低io次数从而提升查询性能
强调:一旦为表创建了索引,以后的查询都会先查索引,再根据索引定位的结果去找数据


03 索引的影响
1.加速查询
2.降低写入(增加 删除 修改)速度
3.会额外占用磁盘空间


4.索引的分类
1.聚集索引 就是主键索引 (primary key )
- 主键索引:加速查找 + 不能为空 + 不能重复
行中的完整记录存在聚集索引的叶子节点上

2.辅助索引 (unique,index)
- 普通索引:加速查找
- 唯一索引:加速查找 + 不能重复

叶子节点 存储索引字段的值 还有 主键的值
使用辅助索引时 会产生两种现象
1.回表 要查的数据就不在辅助索引中 需要到聚集索引中查找
2.覆盖索引 要查的数据就在辅助索引中

- create index 索引名称 on 表名(列名,)
- drop index 索引名称 on 表名

- create unique index 索引名称 on 表名(列名)
- drop unique index 索引名称 on 表名

3 联合索引(多列):
- 联合主键索引
- 联合唯一索引
- 联合普通索引
为是什么使用它
降低资源的占用 , 降低增删改的时间 会比单个字段的索引快

建立联合索引时 应该把区分度高放最左边 区分度低的依次往右放
按照区分度的高低 从左往右 依次排列

查询中 应该优先使用左边的索引
使用and时 无所谓书写顺序 会自动找区分度最高的
注意联合索引在查询时 如果压根没用到最左侧索引 不能加速查询

组合索引(最左前缀匹配):
- create unique index 索引名称 on 表名(列名,列名)
- drop unique index 索引名称 on 表名

- create index ix_name_email on userinfo3(name,email,)
- 最左前缀匹配
select * from userinfo3 where name=‘alex‘;
select * from userinfo3 where name=‘alex‘ and email=‘asdf‘;

select * from userinfo3 where email=‘alex@qq.com‘;

组合索引效率 > 索引合并
组合索引
- (name,email,)
select * from userinfo3 where name=‘alex‘ and email=‘asdf‘;
select * from userinfo3 where name=‘alex‘;
索引合并:
- name
- email
select * from userinfo3 where name=‘alex‘ and email=‘asdf‘;
select * from userinfo3 where name=‘alex‘;
select * from userinfo3 where email=‘alex‘;
名词:
覆盖索引:
- 在索引文件中直接获取数据

索引合并:
- 把多个单列索引合并使用


索引的正确使用姿势
命中索引 ,条件中有索引字段匹配上
1.无论索引如何设计 无法降低范围查询的查询速度
select count(*) from usr where id > 1;
即使命中索引也无法提高效率

2.索引不应该加在值重复度很高的字段上 应该加在重复度低的字段
3. 使用and时 当 条件中出现多个索引命中时 会自定找一个区分度最高的索引来使用


4.使用or的时候 如果两边都有索引 会使用索引,但是注意 or两边都要执行 顺序依然从左往右
只有一边有索引会不会使用索引? 不会使用 无法加速查询

5.优化查询 不仅仅要加索引,sql语句也需要优化 使其能命中索引
你的条件中应该使用区别度高的索引


正常开发时
优先使用聚集索引
再次 使用联合索引 如果你的条件不包含最左侧索引 不能加速查询 这时候就应该使用单个字段索引

创建索引:
create index 索引名称 on usr(索引字段);


Python- 索引

标签:注意   ==   __call__   根据   字段   如何   create   问题   实例   

原文地址:https://www.cnblogs.com/du-jun/p/10029081.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!