11.26
一、索引:搜索引导,好比是图书的目录。
为什么使用索引?
索引是提升查询效率最有效的手段!
在数据库中插入数据会引发索引的重建
简单的说索引的就是用帮我们加快查询速度的。
但也不是索引越多速度越快的!!! 如果没有命中索引速度反而会降低。
索引的分类
1.聚集索引 就是主键索引
行中的完整记录存在聚集索引的叶子节点上
2.辅助索引 除了主键的索引
叶子节点 存储索引字段的值 还有 主键的值
使用辅助索引时 会产生两种现象
1.回表 要查的数据就不在辅助索引中 需要到聚集索引中查找
2.覆盖索引 要查的数据就在辅助索引中
查询速度对比:
聚集索引 > 覆盖索引 > 非覆盖索引
mysql中的索引
主键
外键
index索引
索引的正确使用姿势
命中索引 ,条件中有索引字段匹配上
1.无论索引如何设计 无法降低范围查询的查询速度
select count(*) from usr where id > 1;
即使命中索引也无法提高效率
2.索引不应该加在值重复度很高的字段上 应该加在重复度低的字段
3. 使用and时 当 条件中出现多个索引命中时 会自定找一个区分度最高的索引来使用
4.使用or的时候 如果两边都有索引 会使用索引,但是注意 or两边都要执行 顺序依然从左往右
只有一边有索引会不会使用索引? 不会使用 无法加速查询
5.优化查询 不仅仅要加索引,sql语句也需要优化 使其能命中索引
你的条件中应该使用区别度高的索引
6.联合索引
为是什么使用它
降低资源的占用 , 降低增删改的时间 会比单个字段的索引快
建立联合索引时 应该把区分度高放最左边 区分度低的依次往右放
按照区分度的高低 从左往右 依次排列
查询中 应该优先使用左边的索引
使用and时 无所谓书写顺序 会自动找区分度最高的
注意联合索引在查询时 如果压根没用到最左侧索引 不能加速查询
正常开发时
优先使用聚集索引
再次 使用联合索引 如果你的条件不包含最左侧索引 不能加速查询 这时候就应该使用单个字段索引
创建索引:
create index 索引名称 on usr(索引字段);
二、元类
是创建类的类。
# class_name = "Dog" # bases = (object,) # pic_dict = {} # class_body = """ # def __init__(self): # print('狗初始化了') # color='red' # # def talk(self): # print('狗再叫') # """ # # exec(class_body, {}, pic_dict) # print(pic_dict) # c = type(class_name, bases, pic_dict) # # print(c) # c1=c()
一个类必须具备的内容
1.类名
2.基类
3.名称空间
默认情况下 所有的类都是通过type这个元类示例化的
我们完全可以自己来实例化
元类的作用?
用于创建类的类 称为元类
三、元类实现单例
元类实现单例 就是拦截了元类中的__call__的正常执行 使得创建对象都必须经过自己判断逻辑
class MyMetaClass(type): instance = None def __call__(cls, *args, **kwargs): if not MyMetaClass.instance: # 创建空对象 MyMetaClass.instance = object.__new__(cls) print("创建新的播放器对象!") #初始化对象 MyMetaClass.instance.__init__(*args,**kwargs) # 返回对象 return MyMetaClass.instance # 只能有一个播放器实例 class CDPlayer(metaclass=MyMetaClass): def play(self,music): print("切换音乐",music) def __init__(self,music_name): self.music_name = music_name p1 = CDPlayer("你发如雪!")