密集索引和稀疏索引:
密集索引文件的每个索引码都对应一个索引值(该行数据存储在叶子节点上)
稀疏索引文件 只为索引码的某些值建立索引项
myisam是稀疏索引
innodb是有且仅有一个密集索引:如果主键被定义,该组件就是密集索引;如果没有被定义,该表的第一个非
空唯一索引则为密集索引;
如果不满足以上条件,innodb内部会生产隐藏的主键(密集索引)
非主键索引存储相关键位和其对应的主件值,包含两次查询;
innodb(数据和索引一起)
主键索引,因为行的信息只存储在叶子节点上,所以经过一次加载到内存,就可以获得结果
非主键索引,需要先按该索引查找到主键的值,再进行主键的索引加载,需要经历两个步骤
myisam(数据和索引是分开的)
是主键索引和非主键索引都是稀疏索引,也就是只存储了索引值和对应的数据地址,索引使用非主键索引时,不需要经历两个步骤。
问题回答:为什么需要使用索引?(可以避免全表扫描,提升查找效率)
什么字段可以成为索引?(主键,唯一键,有一定区分性的字段)
索引的数据结构是什么?(B+树,hash结构,bitmap等)
mysql不支持bitmap数据结构,innodb和myisan不支持hash结构
稀疏索引和密集索引的区别:稀疏索引的索引和数据是分开的,密集索引的数据和索引都存在叶子节点上
问题解决:
1、根据慢日志定位慢查询sql
如何定位和慢查询sql步骤
2、使用expliant
type的类型,如果出现all和index,就需要优化
extra如果出现临时表或者文件排序,就需要优化
上图是查询慢日志的设置,分别是查询的时间,开启慢查询,慢查询的日志存储地址
3、修改sql,走索引,提升性能
2、联合索引的最左匹配原则的成因 联合索引ab 如果是a走索引 ab走索引 b不走索引
索引是建立越多越好吗
作业:
1、学习主外键,唯一键约束;
2、研究innodb或者myisam引擎的索引特性
mybatis如何批量插入数据
聚集索引与非聚集索引的区分 区分聚集索引和非聚集索引的一个主要方法是查看叶子节点,如果叶子节点是真实的数据,那么就是聚集索引;如果叶子节点是指针,那么就是非聚集索引。
如果是在一个有聚集索引的表中使用非聚集索引,那么这个非聚集索引叶子节点指向的是聚集索引的位置,如果没有聚集索引, 那么就指向数据页的rowid,这样的表示无序的,也叫做堆表。
覆盖索引的定义:
如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。
回表:先索引扫描,再通过ID去取索引中未能提供的数据,即为回表
二叉查找树:
数据库
上图说明: 数据库的设计,首先是有 存储模块:这些是在磁盘里; 存储管理模块:数据的关系需要映射成逻辑的关系,实现了物理内存的逻辑映射; sql解析:将我们编写的语句解析成机器指令 缓存机制:缓存sql语句和查询的数据,提高数据库性能,也有淘汰机制 日志管理:bin.log日志文件 权限划分:不同的用户,对数据库的操作权限不同 容灾策略:保证数据库在崩溃之后,如何去恢复 索引管理: 锁管理:
索引:如果不做索引,需要对全表扫描,也就是将磁盘中的这个表所有的块和页都加载到磁盘中,在去查找,如果是只找几行数据,这是很快的。
存储索引的数据结构
二叉树:每个树的节点,最多只有两个子节点:组织的规则,左子节点<母《右子节点;查找的时候,是使用二分法去查找。
二叉树的缺点就是可能成为线下二叉树,性能大大减低
同时,二叉树,如果数据量很大,就会产生多次的io,也花费很多的时间
B树 1/根节点至少两个孩子 2、树中,每个孩子最多含有m个孩子m》2 3、除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子,就是是M/2的最小整数 4、所有叶子节点都位于同一层(用于限制关键字数量和大小),上面的是保证数据存储最大化 这些约束,主要是为了让每个存储块存储更多的信息,减低树的高度,减少io次数
上面的约束,也可以防止数据插入删除后,变成线性的格式
B+树
1、因为相同的内存,可以存储跟多的数据(不存放数据,只存放索引信息) 2、因为每每次都需要走这个索引,索引查询数据的时间基本是相同的 3、以为叶子节点之间,有指针指向,索引在做范围查询的时候,只需在叶子节点进行,不需要重复地从根部开始,所以在做范围查询会跟优秀
hash索引:
bitmap(
锁:
myisam:表锁(不支持事务) myisan在查询的时候,会对这个表进行上锁,所以这个过程中,多表进行修改时,需要先等待查询完,再更新 myisam对数据进行读和写的时后,都会对表上锁
给表上锁 lock tables tablename read 给表上读锁 unlock tables 解锁
读锁和写锁的区别 读锁,当上读锁的时候,其他的session还是可以进行读的操作,但是不能进行修改的操作 当上了写锁,读锁时阻塞的,只有等待写锁释放了,才可以上读锁 上了写锁,就不可以再上写锁,直到释放
所以:读锁也叫共享锁,多个session可以读数据 写锁,再一个session对表进行修改的时候,其他的session都会阻塞,也就叫排他锁(insert,update、delete,select) select 语句可以通过 select ... for update 来实现排他锁
innodb时行级锁 在innoDb中,数据的锁时在提交的时候才会去上锁,session的时候,可以设置手动提交,这时候,数据的操作时无锁的操作,不过可以通过语句 select * from tablename lock in share mode;
(支持事务) innodb在没有用到索引的时候,还是表级锁
共享锁:读锁 排他锁:写锁
自动锁:增,删,改都会上锁; 显式锁:查询时,使用语句上锁
乐观锁:认为锁是不会被修改的,只有处理完,修改了版本号,才会自加一,查询获取资源
,对于两个线程同时去执行修改事务的时候,如果获取了版本号都是相同的,修改前都是相同的值,那么这两个数据就没有互斥。会存在问题。 悲观锁:数据是每次修改,都会对其进行上锁
原子性:要么成功,要么失败
一致性:事务前有的数据状态一致
隔离性:事务间的影响
持久性:一旦提交,就永久保存
脏读问题,在事务未提交的的时候,其他事务读取到这个事务每提交的数据,并进行了修改;,导致最终的数据错误
inndb的事务默认级别时repetableread,重复读 重复度;即使1事务先获取了数据,2事务对这个数据进行了修改,1事务查询再对数据进行修改时,是按照数据库最新的值进行计算
序列化事务:没执行一条sql都会上锁