python的索引_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 * from 表 where条件 group by 分组 having 聚合;

# 300万条数据

# 分页

# page= 1# num_per= 10# tmp= (page-1)*num_per = 1-1=0*10 = 0#select * from 表 where id between tmp and tmp+num_per

# page+=1 = 2# tmp= (page-1)*num_per = 10#select * from 表 where 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';

# 有没有索引

# 有几个

# 用哪一个索引比较效率高

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值