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进行定期优化

原文地址:https://www.cnblogs.com/shaohuagu/p/12312596.html