对MySQL
的学习与总结。
存储引擎
MySQL
的存储引擎是表级别、以插件的方式来处理sql
的组件,通常了解的存储引擎有:
InnoDB Storage Engine
MyISAM Storage Engine
The MEMORY Storage Engine
MySQL
早期的默认存储引擎是MyISAM
,InnoDB
其实是第三方自己开发的存储引擎,后来被Oracle
收购了
InnoDB
使用InnoDB
存储引擎表的主索引都是聚集索引,因为表中行实际数据都存储在主索引中的叶子节点上。如图:
B+树的叶子节点的数据域存储数据本身
其他索引的叶子节点存储的都是对应数据在主索引的位置,所以查询如果通过其他索引的话,通常会再经过主索引来获取真实的数据。
哈希索引
由于哈希索引不适合数据量大、不支持范围查询的特点,只有部分引擎来实现它。InnoDB
会自动针对热点数据进行的优化,在内存中建立一个哈希表。
因为哈希索引无法进行范围查询,所以在内存中做的都是全表扫描,这也就是数据量不大的时候这么做。
MyISAM
使用MyISAM
存储引擎的表的索引都是非聚集索引,其索引的叶子节点都是存储真实数据的物理地址。如图:
其他索引跟主索引一样,其叶子节点存储对应数据的物理地址。所以这种查询,是一定不会再经过主索引去查询真实数据。如图:
https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html
日志文件
binlog
binlog
是用来记录数据变更,而不是记录SQL
的文件。binlog
是MySQL
级别的,针对于所有存储引擎有效,它与redo
、undo
的关系如下:
undo与redo
undo
:保存事务发生前数据的版本,可以用于撤销修改redo
:用于在崩溃、重启时恢复未完成的事务
1、这些文件放在哪?是表级别的吗?
https://dev.mysql.com/doc/refman/8.0/en/binary-log.html
MySQL中的锁
MVCC
这也是为了事务中隔离性Isolation的实现
其他问题
MySQL大小写不敏感
数据库就是一个文件夹,表就是一个idb文件。
其数据库名称、表明区不区分大小写取决的当前操作系统区不区分大小写;由于历史原因,mac
、window
是不区分的;而unix
、linux
是区分的
https://dev.mysql.com/doc/refman/5.7/en/innodb-multi-versioning.html