Python- 索引,,1.索引 聚集


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- 索引

评论关闭