目录
数据库05 /索引、数据库备份、锁和事务、慢查询优化、索引命中相关
1. 什么是索引
1.索引在MySQL中也叫做“键”或者"key"(primary key,unique key,还有一个index key),是存储引擎用于快速找到记录的一种数据结构。
2.注意:一旦为表创建了索引,以后的查询最好先查索引,再根据索引定位的结果去找数据
3.索引是应用程序设计和开发的一个重要方面。若索引太多,应用程序的性能可能会受到影响。而索引太少,对查询性能又会产生影响,要找到一个平衡点,这对应用程序的性能至关重要。
索引的种类:普通索引、聚集索引(主键索引)、唯一索引(unique)
2. 索引的原理
1.索引本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
2.索引的影响
1、在表中有大量数据的前提下,创建索引速度会很慢
2、在索引创建完毕后,对表的查询性能会发幅度提升,但是写性能会降低
3.磁盘IO与预读
1.磁盘读取数据靠的是机械运动,每次读取数据花费的时间可以分为寻道时间、旋转延迟、传输时间三个部分
2.考虑到磁盘的IO操作,操作系统做了一些优化,当一次IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,局部预读性原理:当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page)。具体一页有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内的数据时候,实际上才发生了一次IO,这个理论对于索引的数据结构设计非常有帮助。
3. 索引的数据结构(聚集索引、辅助索引)
1.创建索引的条件:
1.索引字段要尽量的小
2.索引要具有辨识度
2.MyISAM存储引擎
frm结尾的是表结构,MYD结尾的是数据文件,MYI结尾的就是索引文件
3.InnoDB存储引擎
表结构.frm(存什么字段什么类型这些东西)的文件中
那就只剩下.idb结尾的数据文件了,索引也在这里面
4.聚集索引
聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,同时叶子结点存放的即为整张表的行记录数据,也将聚集索引的叶子结点称为数据页。
5.聚集索引的特点
会以id字段作为依据,去建立树形结构,但是叶子节点存的是你表中的一条完整记录,一条完整的数据;
6.聚集索引的好处:
它对主键的排序查找和范围查找速度非常快,叶子节点的数据就是用户所要查询的数据。
范围查询(range query),即如果要查找主键某一范围内的数据,通过叶子节点的上层中间节点就可以得到页的范围,之后直接读取数据页即可
7.聚集索引和辅助索引的异同点
相同点:不管是聚集索引还是辅助索引,其内部都是B+树的形式,即高度是平衡的,叶子结点存放着所有的数据。
不同的点:叶子结点存放的是否是一整行的信息
普通索引建立树形结构,提高查询效率,但是叶子节点存的是该列的数据和对应行的主键值
4. 索引操作
1.添加主键索引:
创建的时候添加:添加索引的时候要注意,给字段里面数据大小比较小的字段添加聚集索引的添加方式
create table t1(
id int primary key
)
create table t1(
id int,
primary key(id)
)
表创建完了之后添加
alter table 表名 add primary key(id)
删除主键索引:
alter table 表名 drop primary key;
2.唯一索引
create table t1(
id int unique
)
create table t1(
id int,
unique key uni_name(id)
)
3.普通索引:
创建:
create table t1(
id int,
index index_name(id)
)
alter table s1 add index index_name(id);
create index index_name on s1(id);
删除:
alter table s1 drop index u_name;
drop index 索引名 on 表名字;
4.联合索引(联合主键、联合唯一、联合普通索引)
create table t1(
id int,
name char(10),
index index_name(id,name)
)
建立联合索引的一个原则:
索引是有个最左匹配的原则的,所以建联合索引的时候,将区分度高的放在最左边,依次排下来,范围查询的条件尽可能的往后边放。
5.覆盖索引
InnoDB存储引擎支持覆盖索引(covering index),即从辅助索引中就可以得到查询记录,而不是需要查询聚集索引中的记录。(在普通索引要查询的是正好是存在叶子节点的记录/数据)
辅助索引不包含一整行的记录,因此可以大大减少IO操作。覆盖索引是mysql dba常用的一种SQL优化手段
从执行计划看到,这个SQL语句只通过索引,就取到了所需要的数据,这个过程,就称为索引覆盖
5.索引的最左匹配特性
数据来了以后,从数据块的左边开始匹配,再匹配右边的
5. 索引的两大类型hash与btree
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)
6. MySQL数据库备份
mysqldump
备份:mysqldump -u root -p -B -d 库名>路径(G:\av\av.sql)
还原:mysql -u root -p<路径(G:\av\av.sql)
7. 锁和事务
1.Innodb存储引擎默认是行级锁
Myisam表锁
共享读锁:lock table tableName read;(表级锁)
独占写锁:lock table tableName write;(表级锁)
表锁,读锁会阻塞写,不会阻塞读。而写锁则会把读写都阻塞
InnoDB行锁
select * from xx where ... lock in share mode;共享锁
select * from xx where ... for update;排它锁(添加行级锁)
共享锁和排它锁的区别:
1.添加共享锁之后,一个事务获取了共享锁,其他事务能获得其对应的共享锁,但不能获得排他锁
别的事务可以对其进行读的操作,但是不可以进行增删改的操作
2.添加排它锁之后,一个事务获取了排他锁,其他事务就不能再获取其对应的其他锁(排他锁或者共享锁)
别的事务不可以对其进行增、删、改、读等的操作
2.事务
原子性、一致性、隔离性、持久性
begin;或者 start transaction;
commit; 提交
rollback; 回滚
9. 慢查询优化的基本步骤
0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE
1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高
2.explain查看执行计划,是否与预期一致(从锁定记录较少的表开始查询)
3.order by limit 形式的sql语句让排序的表优先查
4.了解业务方使用场景
5.加索引时参照建索引的几大原则
6.观察结果,不符合预期继续从0分析
10. 正确的使用索引
10.1 索引命中需注意的问题
首先看逻辑是否正确(例如:哪个表先查,哪个表后查)
1 范围问题,或者说条件不明确,条件中出现这些符号或关键字:>、>=、<、<=、!= 、between...and...、like
2 尽量选择区分度高的列作为索引
3 =和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
4 索引列不能参与计算
5 or只要一个匹配成功就行,所以对于连续多个or:mysql会按照条件的顺序,从左到右依次判断,即a->b->c->d
6 最左前缀匹配原则
7 使用函数
select * from tb1 where reverse(email) = 'zhangsan';
8 类型不一致
10.2 其它注意事项
1 避免使用select *
2 count(1)或count(列) 代替 count(*)
3 创建表时尽量时 char 代替 varchar
4 表的字段顺序固定长度的字段优先
5 组合索引代替多个单列索引(经常使用多个条件查询时)
6 尽量使用短索引
7 使用连接(JOIN)来代替子查询(Sub-Queries)
8 连表时注意条件类型需一致
9 索引散列值(重复少)不适合建索引,例:性别不适合
11. 拓展
1.读写分离:
为了确保数据库产品的稳定性,很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器;第二台数据库服务器,主要进行读的操作。
2.主从复制:
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
3.高可用:
“高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。
工作方式:
(1)主从方式 (非对称方式)
工作原理:主机工作,备机处于监控准备状况;当主机宕机时,备机接管主机的一切工作,待主机恢复正常后,按使用者的设定以自动或手动方式将服务切换到主机上运行,数据的一致性通过共享存储系统解决。
(2)双机双工方式(互备互援)
工作原理:两台主机同时运行各自的服务工作且相互监测情况,当任一台主机宕机时,另一台主机立即接管它的一切工作,保证工作实时,应用服务系统的关键数据存放在共享存储系统中。
(3)集群工作方式(多服务器互备方式)
工作原理:多台主机一起工作,各自运行一个或几个服务,各为服务定义一个或多个备用主机,当某个主机故障时,运行在其上的服务就可以被其它主机接管。
4.热备:
热备从广义上讲,就是服务器高可用应用的另一种说法,从狭义上讲,双机热备特指基于高可用系统中的两台服务器的热备。
从广义上讲,就是服务器高可用应用的另一种说法,英译为:high available,而我们通常所说的热备是根据意译而来,同属于高可用范畴,而双机热备只限定了高可用中的两台服务器。热备软件是用来解决一种不可避免的计划和非计划系统宕机问题的软件解决方案,当然也有硬件的。是构筑高可用集群系统的基础软件,对于任何导致系统宕机或服务中断的故障,都会触发软件流程来进行错误判定、故障隔离、以及通地联机恢复来继续执行被中断的服务。在这个过程中,用户只需要经受一定程度可接受的时延,而能够在最短的时间内恢复服务。
从狭义上讲,双机热备特指基于高可用系统中的两台服务器的热备(或高可用),因两机高可用在国内使用较多,故得名双机热备,双机高可用按工作中的切换方式分为:主-备方式(Active-Standby方式)和双主机方式(Active-Active方式),主-备方式即指的是一台服务器处于某种业务的激活状态(即Active状态),另一台服务器处于该业务的备用状态(即Standby状态)。而双主机方式即指两种不同业务分别在两台服务器上互为主备状态(即Active-Standby和Standby-Active状态)。
5.冷备:
冷备是指两个服务器,一台运行,一台不运行做为备份。这样一旦运行的服务器宕机,就把备份的服务器运行起来。冷备的方案比较容易实现,但冷备的缺点是主机出现故障时备机不会自动接管,需要主动切换服务。