1、cost 成本/开销 Last_query_cost
2、explain 执行计划
InnoDB 支持行级别的锁,支持事物。
MyISAM 支持表级别的锁,不支持事务,读的速度快。
数据的操作是由mysql的执行器执行(数据过滤了,排序了,计算了)
局部性原理:更新一条数据时,会取磁盘一页的数据到缓存 innoDB一页为16kb
innoDB 缓冲池(Buffer Pool)修改数据时会读取到缓冲池里,当修改的数据未同步到磁盘时的数据叫脏页,内存里的脏页同步到磁盘的时候,称为刷脏。默认大小为128m,BufferPool 同时也会持久化到两个文件
Redo log(崩溃恢复作用) 先写日志,再写磁盘。为什么要绕一圈写磁盘?:随机IO,顺序IO。少了寻址,redoLog是顺序IO 很快,少了磁盘寻址的时间。特点:大小固定,记录的是操作日志。
Undo log 特点:展示事务之前的数据。
binlog(服务端的日志) 记录的是 DDL DML语句 1、 可以做数据的恢复,必须有全量的备份( 2:00的全量数据 10:00删除了,先把数据恢复到2:00 然后执行binlog日志 的dml语句和ddl语句) 2、主从同步(master-slave slave 有一个I/O线程,他可以拿到master的binlog文件发给slave服务器的relayLog中,使用sqlThread执行relay log日志)
索引篇----------------
索引的本质就是一个数据结构,保存的是数据key,value,磁盘地址。
为什么不使用平衡二叉树来做索引,拿id举例子,一页数据为16kb但是平衡二叉树只能存几byte,会造成空间的浪费。而且二叉树深度更深,io次数更多。
升级为多路平衡查找树,与平衡二叉树比较,就是会变矮胖,路数更多,层次更少,所以io次数变少
再次升级为b+树,特点:只有叶子节点可以存储数据,叶子与叶子之间增加指针,范围查找可以根据叶子之间的指针查找,B树能解决的问题B+树都能解决。扫库扫表的能力更高,只扫叶子节点就可以了。排序能力更强,可以按叶子节点排序,磁盘读写能力更强,路数更多,效率更稳定,经历的io次数是相同的。
索引分为两种,第一种主键索引,第二种辅助索引
聚集索引就是主键索引,如果没有主键索引,会有个隐藏得rowid当成聚集索引。
主键索引:存储得是存储索引和数据
辅助索引:叶子节点保存得是索引和主键值
回表:使用辅助索引查找到数据id后,根据主键索引查找数据,多遍历了一次得过程。
索引使用原则
根据列的离散度,就是根据重复值越小,离散度越高。因为如果离散度低的话可能执行成本不如进行全表的扫描。
联合索引最左匹配,索引按什么顺序创建,b+树就会按什么顺序构建。不能跳过左边字段。如果顺序不对,优化器会做优化成顺序一样的,所以,联合索引创建时常用字段放左边。--如果联合索引和单个索引都有的话需不需要创建两个(不需要,单个索引是多余的)
覆盖索引:就是select 的列已经包含再用到的索引里面。就是不需要回表,效率更高。
前缀索引:就是字段太长,前几个字符来做索引。
用不到索引的情况:like前加%,负向查询,使用函数
事务相关--------
特点:原子性,一致性,隔离性,持久性
原子性:使用undoLog实现
持久性:redoLog实现
读一致性问题---------------------------------------
脏读:读未提交的数据
不可重复读:update/delete 执行相同的操作 读取到已经提交的数据
幻读:insert 读取到已提交的数据
解决:四种事务隔离机制(未提交读,已提交读,可重复读,串行话)
如何解决的:第一种:加锁 行级共享锁: 行级排他锁:delete、update、insert 自动添加
第二种:mvcc(数据快照) 举例子就是一张表里有两个状态,一个是创建版本号,一个删除版本号。当开启事务时表里的数据建立创建版本号,当跟新时,更新当前id数据的删除版本号,当再事务里查询时,只查小于创建版本号的和大于删除版本号的数据就可以查出当前事务的数据。
布隆过滤器-----
如果说没有,那么肯定没有,如果说有,有可能没有
hash一致性算法----
当集群中有机器发生变动,不至于大量数据移动问题。比如有三个redis服务器,通过相同得计算,hash(ip+编号)%2^32计算出一个值,还有一个hash环,有2^32个点,通过redis相同得计算可以得出服务器应该位于那个点,当有数据过来时,数据根据(key)%2^32 得出属于哪个点,顺时针判断哪个redis离得最近,就保存再哪个服务器中。这样如果当添加机器时,只需要重置一部分数据就可以了。
单体业务复杂度变高,面向服务开发。