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("你发如雪!")
原文地址:https://www.cnblogs.com/zhanggq/p/10029702.html