wangjie_fourth

may the force be with you

0%

MySQL的学习与总结

MySQL的学习与总结。

存储引擎

MySQL的存储引擎是表级别、以插件的方式来处理sql的组件,通常了解的存储引擎有:

  • InnoDB Storage Engine
  • MyISAM Storage Engine
  • The MEMORY Storage Engine

MySQL早期的默认存储引擎是MyISAMInnoDB其实是第三方自己开发的存储引擎,后来被Oracle收购了

InnoDB

使用InnoDB存储引擎表的主索引都是聚集索引,因为表中行实际数据都存储在主索引中的叶子节点上。如图:

B+树的叶子节点的数据域存储数据本身

其他索引的叶子节点存储的都是对应数据在主索引的位置,所以查询如果通过其他索引的话,通常会再经过主索引来获取真实的数据。

哈希索引

由于哈希索引不适合数据量大、不支持范围查询的特点,只有部分引擎来实现它。InnoDB会自动针对热点数据进行的优化,在内存中建立一个哈希表。

因为哈希索引无法进行范围查询,所以在内存中做的都是全表扫描,这也就是数据量不大的时候这么做。

MyISAM

使用MyISAM存储引擎的表的索引都是非聚集索引,其索引的叶子节点都是存储真实数据的物理地址。如图:

其他索引跟主索引一样,其叶子节点存储对应数据的物理地址。所以这种查询,是一定不会再经过主索引去查询真实数据。如图:


https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html

日志文件

binlog

binlog是用来记录数据变更,而不是记录SQL的文件。binlogMySQL级别的,针对于所有存储引擎有效,它与redoundo的关系如下:

undo与redo

  • undo:保存事务发生前数据的版本,可以用于撤销修改
  • redo:用于在崩溃、重启时恢复未完成的事务

1、这些文件放在哪?是表级别的吗?


https://dev.mysql.com/doc/refman/8.0/en/binary-log.html

MySQL中的锁

MVCC

这也是为了事务中隔离性Isolation的实现

其他问题

MySQL大小写不敏感

数据库就是一个文件夹,表就是一个idb文件。
其数据库名称、表明区不区分大小写取决的当前操作系统区不区分大小写;由于历史原因,macwindow是不区分的;而unixlinux是区分的


https://dev.mysql.com/doc/refman/5.7/en/innodb-multi-versioning.html