赞
踩
InnoDB支持事务,回滚,事务安全和崩溃恢复,二MyIsam不支持,当查询的速度比innodb更快
InnoDB规定,如果没有设置主键,就会自动生成一个6字节的主键,而myisam允许没有任何索引和主键的存在,索引就是行的地址
innodb支持外键,而myisam不支持
Innodb支持行锁和表锁,而myisam只支持表锁
innodb不支持全文索引,但是可以用插件来实现相对应的功能,二myisam本身就就支持全文索引
innodb获取行数是,需要扫全表,而myisam保存了当前表的总行数,直接读取即可
innodb内存架构分为三大块:缓冲池,重做缓冲池,额外内存池
mysql 默认可重复读
oracle 默认已提交读
mysql binlog的三种格式 statement ,row ,mixed
2.在可重复读隔离级别下,条件列未命中索引会锁表!而在已提交读级别下,只锁行
3.因为读已提交会先走聚簇索引,然后mysql进行优化吧不符合的记录释放,但是在可重复读级别下,走聚簇索引后会锁住整张表,更重要的是不可重复读问题再开发中是可以接受的,毕竟数据都已经提交了,读出来本身就没有太大问题
那感觉默认选择已提交读更好
那为什么mysql用的是可重复读而不是read committed
因为历史原因:从主从复制开始讲起,主从复制是基于binlog复制的,有三种格式,分别是,statement:记录的是修改sql语句
row:记录的是每行实际数据的变更
mixed:statement和row模式的混合
而mysql在5.0以前 binlog只支持statemnet这种格式,而这种格式在已提交读这个隔离级别下主从复制是有bug的,因此mysql将可重复度作为默认的隔离级别
存在什么bug
这个时候实际上在已提交读的情况下数据库中是有一条数据的
可是binlog文件却是不存在的,因为insert 先提交 而 delete后提交
故写入binlog里的是先insert 后delete 导致主从复制后数据不存在
如果是可重复读,就会进行delete的时候会加上间隙锁,导致后面的insert执行不了,自然也就不会导致上述bug了
简单来说:先删后插会造成binlog文件丢失数据
因为读已提交不存在间隙锁,而默认使用的statement会先记录
https://blog.csdn.net/ChaoticNg/article/details/115197622
详细看这里吧,太多字懒得打了
1.有k个元素的中间节点的包含k个元素(b树中是k个元素),中间节点的每个元素不保存数据,数据存储在叶子上面
2.叶子节点包含了全部元素的信息,以及指向含这些元素记录的指针。
3.所有的叶子接点都同时存在于子接点,在子接点中是最大(或最小)的元素
1.单一节点存储更多的元素,使得查询的IO次数更少;
2.所有查询都要查找到叶子节点,查询性能稳定;
3.所有叶子节点形成有序链表,便于范围查询。
(A事务读取了B事务未提交的数据)
解决方法:在事务提交前,不允许读取其修改后的数据
修改事务完全提交后,才可以读取数据,就可以解决不可重复读
解决方法:在其他操作事务完成数据处理之前,任何其他新事务都不可以添加新数据,可以避免该问题(只允许一个事务进行)
(一次只运行一个事务进行)
先设置 set global autocommit=0;
rollback回滚
commit提交
1.中间节点会在子节点中冗余一份,而且在子节点中是最大(或最小的)
2.叶子结点存的数据,而且数据之间有双向指针把数据连接在一起
在索引列上进行运算操作,索引将失效
字符串类型字段使用时,不加引号,索引将失效
如果仅仅是尾部模糊匹配,索引不会失效,如果是头部模糊查询,索引失效
用or分割开的条件,如果or前的条件中有索引,后面的列中没有索引,那么涉及的索引都不会被用到。
在MYSQL查询时,会评估使用索引的效率和走全表扫描的效率,如果走全表扫描更快,则放弃索引,走全表扫描,因为索引是用来索引少量数据的,如果索引查询放回大批量的数据,还不如走全表扫描来的快,此时索引会失效
hash索引(memory索引支持)
b+树索引
FULLTEXT索引
R-TREE索引
主键索引
单列索引
多列索引
唯一索引
空间索引(针对空间的数据结构建立的索引)
1聚簇索引
2非聚簇索引
原子性是指一个事务是一个不可分割的整体,内部的操作要么都做,要么都不做,所以说,实现原子性的核心就在于如何实现回滚
事务执行的结果是数据库从一个一致性状态变到另一个一致状态,即数据库完整性没有被破坏,事务执行的前后都是合法的状态
(数据完整性包括但不限于,实体完整性,如行的主键存在且唯一,列完整性如字段的类型,大小,长度要符合要求,外键约束,用户自定义完整性)
事物内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性是指事务一旦提交,他对数据库的改变就是永久的,接下来的其他操作不对应该对其有任何影响,并且不能回滚
A(原子性):
undo log
C(一致性)
1.保证原子性,持久性,隔离性,如果这些无法保证,事务的一致性也无法保证
2.数据库本身提供保障,例如不运行向整行列插入字符串值,字符串长度不能超过列的限制等
3.应用层面进行保障,例如如果转账操作只扣除转账者的劲儿,二没有增加接收者的余额,无论数据库实现的多么完美,也无法保证状态的一致性
I(隔离性)
实现分为两方面
1.一个事务写操作对另外一个事务写操作的影响:锁机制保证隔离性
2.一个事务写操作对另外一个事务读操作的影响:MVVC保证隔离性
D(持久性)
redo log
数据是放在磁盘的,但是如果每次读写数据都需要磁盘io,效率会很低,为此,Innodb提供了缓存,bp中包含了部分数据页的映射,作为访问数据库的缓冲,当从数据库读取数据时,会首先写入BP,BP中修改的数据会定期刷新到磁盘中(这一过程称为刷脏)
BP的使用打打提高了读写数据的效率,但是也带来了新的问题,如果MYSQL宕机,而此时BP中修改的数据还没有刷新到磁盘,就会导致数据的丢失,事务的持久性就无法保证。
redo log就被引入来解决这个问题(宕机导致BP中的数据没有刷新磁盘,造成数据丢失)当数据被修改时,除了修改BP中的数据,还会在redo log中记录这次操作
当事务提交是,会调用fsync接口对redo log 进行刷盘,如果MYSQL宕机,重启时可以读取redo log 中的数据,对数据库进行恢复,redo log 采用的是 WAL(write-ahead logging,预写式日志)所有修改先写入日志,在更新到BP,保证了数据不会因为MYSQL宕机而丢失,从而满足了持久性的要求。
将数据库设定为多主模式,这样每次新增数据都会去做同步这样避免生成一样的iad
设置起始值和步长(缺点是需要规定数据库个数)
1.先进行双主同步
2.同步完成后进行主主双写
3.删除双主同步,修改数据库配置并重启(秒级)
4.清空数据库中多余数据
set global slow_query_log =1
innodb
功 能 | MYISAM | Memory | InnoDB | Archive |
---|---|---|---|---|
存储限制 | 256TB | RAM | 64TB | None |
支持事物 | No | No | Yes | No |
支持全文索引 | Yes | No | No | No |
支持数索引 | Yes | Yes | Yes | No |
支持哈希索引 | No | Yes | No | No |
支持数据缓存 | No | N/A | Yes | No |
支持外键 | No | No | Yes | No |
在innodb中普通索引只包含主键id需要回表查询,而myisam则不需要,因为存的都是数据
通过回答mysql中的acid是怎么保证的(见16)
bin-log?
B+树
1.中间节点只保存索引,并且在子节点中冗余一份,而且是子节点数据中的最小(或最大)值
2.叶子节点存储的是数据,并且通过双向链表链接起来
1.按数据结构分类
2.按索引结构分类
3.从逻辑角度分类
1.索引列运算
2.字符串不加引号
3.模糊查询
4.or连接条件
5.数据分布影响(如果全表更快的话就不走索引)
1.主从间的数据库不是实时同步,就算网络连接正常,也能存在主从数据不一致的情况
2.如果主从的网络断开,则从库会在网络恢复正常后,批量进行同步。
3.如果对从库进行修改数据,那么如果此时从库正在执行主库的binlog时,则会出现错误而停止同步,这是一个很危险的操作,所以一般情况下,我们要非常小心的修改从库上的数据。
联合索引本质,创建(a,b,c) 的时候,相当于创建了(a)单列索引(a,b)联合索引以及(a,b,c)联合索引,想要索引生效的话,只能使用a和a,b和a,b,c三种组合当然,我们上面测试过,a,c也会走索引但是实际上只用到了a的索引,c并没有用到
如图
仅仅看a是有顺序的(1,1,2,2,3,3)
而仅仅看b是没有顺序的(1,2,1,4,1,2)
但是如果在a相同的情况下,b也是有顺序的
redo log
undo log
bin log
很好理解,就是服务运行过程中发生的严重错误日志。但我们的数据库无法启动时,就可以来这里看看具体不能启动的原因是什么
它有另外一个名字你应该熟悉,叫Binlog,其记录了对数据库所有的更改
记录了来自客户端的所有语句
这里记录了所有响应时间超过阈值的SQL语句,这个阈值我们可以自己设置,参数为long_query_time
,其默认值为10s,且默认是关闭的状态,需要手动的打开。
undo log
redo log
myisam
它有另外一个名字你应该熟悉,叫Binlog,其记录了对数据库所有的更改
记录了来自客户端的所有语句
这里记录了所有响应时间超过阈值的SQL语句,这个阈值我们可以自己设置,参数为long_query_time
,其默认值为10s,且默认是关闭的状态,需要手动的打开。
undo log
redo log
myisam
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。