• python 树 索引


    # root 根节点
    # branch 分支节点
    # leaf 叶子节点

    # 父子节点

    # b+树
    # 平衡树(btree-balance tree) 能够让查找某一个值经历的查找速度尽量平衡
    # 分支节点不存储数据 -- 让树的高度尽量矮,让查找一个数据的效率尽量的稳定
    # 在所有叶子结点之间加入了双向的地址链接 -- 查找范围非常快

    # 两种索引的差别
    # 聚集索引 聚簇索引
    # Innodb 必有且仅有一个 :主键
    # 非聚集(簇)索引 辅助索引
    # innodb
    # myisam

    # innodb存储引擎中的 主键默认就会创建一个聚集索引


    # 1,alex,83
    # 2,wusir,74
    # 3,太白,40
    # 4,大壮,28
    # 5,b哥,20
    # 6,小聂,18
    # 7,雪飞,17
    # 8,小兴,45
    # 9,小鑫,5
    # 10,庄博,99

    # 数据库使用的时候有什么注意事项
        # 从搭建数据库的角度上来描述问题
        # 建表的角度上
            # 1.合理安排表关系
            # 2.尽量把固定长度的字段放在前面
            # 3.尽量使用char代替varchar
            # 4.分表: 水平分,垂直分
        # 使用sql语句的时候
            # 1.尽量用where来约束数据范围到一个比较小的程度,比如说分页的时候
            # 2.尽量使用连表查询而不是子查询
            # 3.删除数据或者修改数据的时候尽量要用主键作为条件
            # 4.合理的创建和使用索引
                # 1.查询的条件字段不是索引字段
                    # 对哪一个字段创建了索引,就用这个字段做条件查询
                # 2.在创建索引的时候应该对区分度比较大的列进行创建
                    # 1/10以下的重复率比较适合创建索引
                # 3.范围
                    # 范围越大越慢
                    # 范围越小越快
                    # like 'a%'  快
                    # like '%a'  慢
                # 4.条件列参与计算/使用函数
                # 5.and和or
                    # id name
                    # select * from s1 where id = 1800000 and name = 'eva';
                    # select count(*) from s1 where id = 1800000 or name = 'eva';
                    # 多个条件的组合,如果使用and连接
                        # 其中一列含有索引,都可以加快查找速度
                    # 如果使用or连接
                        # 必须所有的列都含有索引,才能加快查找速度
                # 6.联合索引 : 最左前缀原则(必须带着最左边的列做条件,从出现范围开始整条索引失效)
                    # (id,name,email)
                    # select * from s1 where id = 1800000 and name = 'eva' and email = 'eva1800000@oldboy';
                    # select * from s1 where id = 1800000 and name = 'eva';
                    # select * from s1 where id = 1800000 and email = 'eva1800000@oldboy';
                    # select * from s1 where id = 1800000;
                    # select * from s1 where name = 'eva' and email = 'eva1800000@oldboy';
                    # (email,id,name)
                    # select * from s1 where id >10000 and email = 'eva1800000@oldboy';
                # 7.条件中写出来的数据类型必须和定义的数据类型一致
                    # select * from biao where name = 666   # 不一致
                # 8.select的字段应该包含order by的字段
                    # select name,age from 表 order by age;  # 比较好
                    # select name from 表 order by age;  # 比较差
    
    
    
    
    
    # select * fromwhere 条件 group by 分组 having 聚合;
    # 300万条数据
    # 分页
    # page = 1
    # num_per = 10
    # tmp = (page-1)*num_per = 1-1=0*10 = 0
    # select * fromwhere id between tmp and tmp+num_per
    # page +=1 = 2
    # tmp = (page-1)*num_per = 10
    # select * fromwhere id between 10 and 20
    #
    # select * from 表 limit 10,10
    # select * from 表 limit 20,10
    #
    # select * from 表 limit 2999990,10
    # 联合索引
    # (id,email)
    # id = 100 and email like 'eva%';
    
    # 索引合并 :分开创建在查询过程中临时合并成一条 Using union(ind_id,ind_email)
        # 创建索引的时候
        # create index ind_id on s1(id)
        # create index ind_email on s1(email)
        # select * from s1 where id=100 or email = 'eva100@oldboy'
        # 临时把两个索引ind_id和ind_email合并成一个索引
    
    
    # 覆盖索引:在查询过程中不需要回表   Using index
        # 对id字段创建了索引
        # select id from s1 where id =100     覆盖索引:在查找一条数据的时候,命中索引,不需要再回表
        # select count(id) from s1 where id =100     覆盖索引:在查找一条数据的时候,命中索引,不需要再回表
        # select max(id) from s1 where id =100     覆盖索引:在查找一条数据的时候,命中索引,不需要再回表
        # select name from s1 where id =100   相对慢
    
    # 什么是mysql的执行计划?用过explain么?
        # 在执行sql语句之前,mysql进行的一个优化sql语句执行效率的分析(计划),可以看到有哪些索引,实际用到了那个索引,执行的type等级
        # id name email
        # select * from s1 where id = 1000000 and name=eva and email = 'eva1000000@oldboy';
            # 有没有索引
            # 有几个
            # 用哪一个索引比较效率高
        # explain select * from s1 where id = 1000000 and name=eva and email = 'eva1000000@oldboy';
    
    #
    # b+树
    # b是balance 平衡的意思
    # 为了保证每一个数据查找经历的IO次数都相同
    # 只在叶子节点存储数据
    # 为了降低树的高度
    # 叶子节点之前加入了双向连接
    # 为了查找范围的时候比较快

    # 聚集索引(聚簇索引)
    # 全表数据都存储在叶子节点上 -- Innodb存储引擎中的主键
    # 非聚集索引(非聚簇索引)/辅助索引
    # 叶子节点不存放具体的整行数据,而是存储的这一行的主键的值

    # 索引的创建和删除
    # create index ind_name on 表名(字段名);
    # create index ind_name on 表名(字段名,字段2);
    # drop index 索引名 on 表名

    # 正确的使用mysql数据库
    # 从库的角度
    # 搭建集群
    # 读写分离
    # 分库
    # 从表的角度
    # 合理安排表与表之间的关系 :该拆的拆,该合的合
    # 把固定长度的字段放在前面
    # 尽量使用char而不是varchar
    # 从操作数据的角度
    # 尽量在where字段就约束数值到一个比较小的范围 : 分页
    # where a between value1 and value2
    # 尽量使用连表查询代替子查询
    # 删除数据和修改数据的时候条件尽量使用主键
    # 合理的创建和使用索引
    # 创建索引
    # 1.选择区分度比较大的列
    # 2.尽量选择短的字段创建索引
    # 3.不要创建不必要的索引,及时删除不用的索引
    # 使用索引
    # 1.查询的字段不是索引字段
    # 2.在条件中使用范围,结果的范围越大速度越慢,范围小就快
    # 3.like 'a%'命中索引,like '%a'不命中索引
    # 4.条件列不能参与计算不能使用函数
    # 5.and/or
    # and条件相连 有一列有索引都会命中
    # or条件相连 所有列都有索引才能命中
    # 6.联合索引
    # create index mix_ind on 表 (id,name,email)
    # 遵循最左前缀原则,且从出现范围开始索引失效
    # select * from 表 where id = 123; 命中索引
    # select * from 表 where id > 123; 不命中索引
    # select * from 表 where id = 123 and name = 'alex'; 命中索引
    # select * from 表 where id > 123 and name = 'alex'; 不命中索引
    # select * from 表 where id = 123 and email = 'alex@oldboy'; 命中索引
    # select * from 表 where email = 'alex@oldboy'; 不命中索引,因为条件中没有id
    # select * from 表 where name='alex' and email = 'alex@oldboy'; 不命中索引,因为条件中没有id
    # 7.条件中的数据类型和实际字段的类型必须一致
    # 8.select字段中应该包含order by 中的字段
    # select age from 表 order by age; 快
    # select name from 表 order by age; 慢

    # 覆盖索引 : 查询过程中不需要回表
    # select id from 表 where id > 10000000;
    # select max(id) from 表 where id > 10000000;
    # select count(id) from 表 where id > 10000000;

    # 索引合并 : 分别创建的两个索引在某一次查询中临时合并成一条索引 a=1 or b=2
    # 执行计划 : explain select 语句 ;能够查看sql语句有没有按照预期执行,可以查看索引的使用情况,type等级
    # 慢查询优化 :
    # 首先从sql的角度优化
    # 把每一句话单独执行,找到效率低的表,优化这句sql
    # 了解业务场景,适当创建索引,帮助查询
    # 尽量用连表代替子查询
    # 确认命中索引的情况
    # 考虑修改表结构
    # 拆表
    # 把固定的字段往前调整
    # 使用执行计划,观察sql的type通过以上调整是否提高
    # mysql的慢日志
    # 在mysql的配置中开启并设置一下
    # 在超过设定时间之后,这条sql总是会被记录下来,
    # 这个时候我们可以对这些被记录的sql进行定期优化

  • 相关阅读:
    WScript.Shell对象的run和exec(脚本调用其他程序)
    Hard link 和 Symbolic link 软链接 硬链接
    SGI STL 红黑树(RedBlack Tree)源代码分析
    宏likely和unlikely
    PCLint输出格式选项
    32位与64位原子操作的问题
    王石与成功的定义
    关于FckEditor基于Asp.net MVC中出现未结束的字符窜常量——解决方案
    崩溃中!Nhibernate的数据分页.
    创建Silverlight技术联盟QQ群 希望大家踊跃加入
  • 原文地址:https://www.cnblogs.com/shaohuagu/p/12312596.html
Copyright © 2020-2023  润新知