# 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';
# 有没有索引
# 有几个
# 用哪一个索引比较效率高
# 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进行定期优化