数据库--索引
数据库--索引
#是什么?
索引就是一张表中数据的目录,数据库根据目录去查对应字段的数据
#作用?
加速数据的查找
#树:一种数据结构
1.一般的树
特点:性能不稳定
2.平衡树(balance tree)------b数
特点:让目录结构更加的合理化,但是查找的io次数不固定
3.b+树:
与b树的区别:
1.将所有的数据都存在叶子节点中(使查找数据的io次数更加稳定)
2.叶子节点之间通过双向指针相连(使查找的更便捷)
#mysql中默认存储引擎Innodb索引的数据结构是B+树。
#INNODB默认一次性最多读取的数据大小为16k
#一次性存储的数据大小和什么相关?
树的高度
#总结:
1.数据长度越短,作为索引建立的树的高度就越矮,效率越高
2.索引列的区分度越大越有利于查找
聚集索引和辅助索引
聚集索引和辅助索引
#数据库中的B+树索引:
可以分为聚集索引和辅助索引(非聚集索引)可以分为聚集索引和辅助索引(非聚集索引)
#聚集索引和辅助索引相同点:
内部都是B+树形式(高度平衡,叶子节点存放着所有数据)
#聚集索引和辅助索引不同点:
叶子节点存放的数据是否为一整行的信息。
#聚集索引的好处:
1.对主键的排序和范围查找速度非常快。
2.范围查询,查找主键某一范围内的数据通过叶子节点的上层中间节点就可以得到页的范围,之后直接读取数据页即可
索引原理:
#Innodb和Myisam的存储方式不同
Innodb内部有一个聚集索引,还有非聚集索引,
内部必须有一个主键,及时没有主键,mysql在创建表的过程中也会自动添加一列作为表的主键
myisam内部没有聚集索引,全是非聚集索引
聚集索引:其实就是在b+树的根节点,把主键+值全部聚集到一块,存在根节点中
非聚集索引:要查询的字段+主键索引存放在根节点中
Mysql索引管理
一.功能:
1.加速查找
2.mysql中的primary key(聚集索引的作用),unique(非聚集索引作用)也都是索引还有约束的功能
二.Mysql常用的索引
#1.普通索引INDEX:(普通的非聚集索引)
加速查找
#2.唯一索引:
主键索引:加速查找+约束(非空+唯一)
唯一索引:加速查找+约束(唯一)
#3.联合索引
联合主键索引:PRIMARY KEY(ID,NAME)
联合唯一索引:UNIQUE(ID,NAME)
联合普通索引:INDEX(ID,NAME)
三.索引的两大类型hash和btree
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树层数越多,数据量指数级增长(INNODB默认支持)
四.创建索引
create index 索引名字 on 表名(字段);
五.删除索引
drop index 索引名 on 表名;
测试索引
测试索引
1.只有给要查的字段创建索引才起起到加速查找的作用
2.即使加了索引的字段,在查看数据范围特别大的时候,也不起作用
例如:><!= between and not in
3.使用like的时候,必须是'abc%'开头的数据才起作用,'%abc%'不起作用
4.区分度不高的列,及时创建了索引速度也很慢
5.在字段的数据进行计算时,索引不起作用
6.and/or
and条件(加速查找):
所有条件有一个条件中的字段加了索引,会按照快的字段进行加速查找
or条件(加速查找):
1.会从左到右进行判断
2.所有列区分度要高
3.or中的条件每一个都必须加了索引
联合索引:
create index 索引名 on s1(字段1,字段2);
7.最左前缀匹配原则:
联合索引的注意点:把能涉及到范围的字段放在后面,能加速查找
其他知识(了解)
辅助索引
合并索引:
查询优化神器-explain
慢查询优化的基本步骤
慢日志管理
数据库的备份和表的备份和重载
备份数据库下的所有表
mysqldump -u root -p t > D:/t.sql
恢复当前库下所有的表:
create database t2;
use t2;
source D:/t.sql#在当前数据库下,恢复所有的表
备份库
C:UsersSince>mysqldump -uroot -p --databases t >D: .sql
恢复库
mysql> source d:/t.sql
事物和锁
begin; # 开启事务
select * from t1 where id = 1 for update; # 查询id值,for update添加行锁;
update t1 set name='wusir' where id = 1; # 完成更新
commit; # 提交事务
总结:两边同时开启事物,在一边进行查询操作并且要改的时候,另一边也要进行开始事物,进行查的时候,程序夯住,
只有等另一边提交事务后,才能进行下面的操作