zoukankan      html  css  js  c++  java
  • 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("你发如雪!")
  • 相关阅读:
    Python shutil模块(目录和文件操作)
    CentOS8的web终端-cockpit
    OpenStack与ZStack深度对比:架构、部署、计算、运维监控等
    Zstack的安装部署
    Git介绍与简易搭建
    Docker 底层技术与端口映射
    Docker 网络
    Dockerfile编写
    Docker监控
    Docker 中卷组管理
  • 原文地址:https://www.cnblogs.com/zhanggq/p/10029702.html
Copyright © 2011-2022 走看看