SQLServer 与 MySQL 出自于不同的公司,最大的区别在于一个开源、一个不开源;不开源的提供低版本免费使用,无法使用高级功能,而开源的就不一样,提供所有的功能使用;
关于存储引擎本人能力有限学识浅薄,只能记录一下我能力范围内对SQL Server 和 MySQL 存储引擎的理解;如果有写的不对的地方请各路大神多多指导。
存储引擎可以分为两部分理解,一部分是存储,一部分是引擎;存储是把数据存储到磁盘上,引擎是为数据存储到磁盘上增加动力的,也就是提升数据存储的速度同时也对数据更新提升速度优化I/O。说到存储一定会想到硬件想到性能,由于本人学的太浅,没法去讲磁盘的内部结构和底层原理。
SQLServer 与 MySQL 存储引擎它们的底层都是磁盘,而它们存储的算法最小单元都是页,多个页组成一个段,多个段组成一个区,其实区就是表;这是他们的通用步骤。但是SQL Server的一个页是8KB 而MySQL的一个页是16KB;页是SQL Server和MySQL 读取的最小I/O单元,也就是说读取某个表中的数据时,会把需要查询行所在的页都读取出来,这就是我有时候感觉到在SQL Server中查询时比在MySQL中时快时慢。
存储引擎不仅提供数据读写速度,还提供数据安全、事务管理、日志、锁、备份还原、自动故障恢复、高可用支持。
存储引擎结构
SQLServer 安装完成后会在SQLServer 配置管理服务器中查看到MSSQLSERVER服务正在运行。

打开登录数据库可以看到任何数据库的数据存储文件,数据文件以.mdf 结尾的是主文件、以.ndf结尾的是辅助文件同样也可以存储数据,ndf可以有多个但是mdf只能有一个,日志是以.ldf结尾的文件,默认不开启事务日志。

代码查询
select * from [Monitors_DB].[dbo].[sysfiles]

如果某个数据创建的物理文件只有一个主数据文件和日志文件,那么所有与数据库发生的操作数据将存储于主数据文件中,如果某个数据库创建的数据有一个主数据文件两个辅助数据文件,一个日志文件,那么数据存储时,会发生等值分配,例如:主数据文件设置大小20G、1号辅助数据文件设置大小40G、2号辅助数据文件设置大小60G,如果有一个600M的数据需要存储在这个数据库中,那么主数据文件将存储100M、1号将存储200M、2号将存储300M。
MySQL查询存储引擎,mysql与SQLserver不一样,mysql能查看存储引擎的任何细节,而sqlserver不能查看,有些即使能查看也非常的麻烦,因位它是不开源的。
mysql> select @@default_storage_engine; --查看当前使用的引擎+--------------------------+| @@default_storage_engine |+--------------------------+| InnoDB |+--------------------------+1 row in set (0.00 sec)
mysql> show engines; --查看mysql所有的存储引擎类型+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| Engine | Support | Comment | Transactions | XA | Savepoints |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| CSV | YES | CSV storage engine | NO | NO | NO || MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO || MyISAM | YES | MyISAM storage engine | NO | NO | NO || BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO || PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO || MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO || ARCHIVE | YES | Archive storage engine | NO | NO | NO || InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES || FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
mysql> show create table city; --查看表使用的是哪一类存储引擎| city | CREATE TABLE `city` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Name` char(35) NOT NULL DEFAULT '', `CountryCode` char(3) NOT NULL DEFAULT '', `District` char(20) NOT NULL DEFAULT '', `Population` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), KEY `CountryCode` (`CountryCode`), CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1 |
[root@Focus_Linux_01 ~]# cd /data/mysql/data/ --数据目录下查看存储引擎结构[root@Focus_Linux_01 /data/mysql/data]# lltotal 123032-rw-r----- 1 mysql mysql 56 Jun 9 05:21 auto.cnfdrwxr-x--- 2 mysql mysql 48 Jun 27 22:46 binlog-rw-r----- 1 mysql mysql 111298 Jun 24 07:44 Focus_Linux_01.err-rw-r----- 1 mysql mysql 6 Jul 1 21:29 Focus_Linux_01.pid-rw-r----- 1 mysql mysql 654 Jul 1 21:29 ib_buffer_pool-rw-r----- 1 mysql mysql 12582912 Jul 6 22:48 ibdata1-rw-r----- 1 mysql mysql 50331648 Jul 6 22:48 ib_logfile0-rw-r----- 1 mysql mysql 50331648 Jul 6 22:48 ib_logfile1-rw-r----- 1 mysql mysql 12582912 Jul 6 22:20 ibtmp1drwxr-x--- 2 mysql mysql 4096 Jun 9 05:21 mysqldrwxr-x--- 2 mysql mysql 8192 Jun 9 05:21 performance_schema
在mysql的安装数据目录下,我们可以看到
开启了二进制日志:binlog,
错误日志文件: Focus_Linux_01.err
缓冲池文件:ib_buffer_pool
临时表存储文件:ibtmp1
系统数据字典信息,UNDO表空间等数据:ibdata1
REDO日志文件、事务日志文件:ib_logfile0~ib_logfile1
进入一个数据 world 查看表的文件,我们可以看到InnoDB引擎中的表会存储两个文件,一个是.frm 另一个是.ibd 文件;frm存储的是表字典和统计信息,ibd存储的是表的数据行和索引数据。
[root@Focus_Linux_01 /data/mysql/data]# cd world/[root@Focus_Linux_01 /data/mysql/data/world]# lltotal 1416-rw-r----- 1 mysql mysql 8710 Jun 14 10:25 city.frm-rw-r----- 1 mysql mysql 1015808 Jun 20 09:21 city.ibd