简单地比较一下MYSQL,DB2,SQLSERVER数据库设计不同点,为日后看MYSQL源代码先打打底,今天先比较数据库对象吧:
1.DB2上关于表有一个表空间的概念,简单地说, 表空间是数据库系统中数据库逻辑结构与操作系统物理结构之间建立映射的重要存储结构,一般来说一个表空间对应一个表.DB2在表空间上分配表空间对应表的一切物理属性,比如首次分配大小,扩展大小,页面每页初始空闲空间,空闲页面占总页面百分比等.因此,DB2上的系统DBA对表的操作更多是基于表空间上.比如因为表上的删改查不可避免地会造成表页面的碎片,DBA要定期对这些碎片进行清理,DBA实际操作的是重组表空间(同时顺带重组索引). DBA对表的备份实际也是通过对表空间的备份实现. 所以DB2上表的恢复可以通过恢复表空间文件或日志文件实现单表恢复,在这一点上DB2优于SQLSERVER.
SQLSERVER上关于表并没有比表空间的概念,物理信息是通过数据库所在文件或者文件组实现.SQLSERVER上也有索引碎片和定期重组/重建索引的需求.SQLSERVER DBA 可通过DMV视图去查询当前索引的碎片量,一般高于30%的索引则必须重建索引;低于30%的索引则可通过重组来处理.(基准一般由项目而定).所以SQLSERVER上定期对索引的维护一般是重建索引
MYSQL存储上也有碎片的概念,但据官方文档,这种碎片并不是因为一般数据删改查而造成,而是因为MYSQL内部中使用VARCHAR,TEXT,BLOB等可变长度的数据类型删改查造成.(-_-!删改查中的霸主,也是删改查),MYSQL上使用OPTIMIZE TABLE进行碎片整理,主要使用在MYISAM上.
其他DB2,SQLSERVER,MYISAM上面的管理维护在下一篇文章讨论.
2. 关于聚集索引和非聚集索引:
SQLSERVER与DB2中存在聚集索引概念,你可以使用语句显式创建聚集索引(加参数CLUSTERED);MYSQL中不存在显式的聚集索引和非聚集索引, INNODB引擎下主键索引即为聚集索引,MYISAM下面没有聚集索引.
MYSQL中除了与SQLSERVER,DB2中类似的普通索引,单列索引,组合索引(后两者在SQLSERVER与DB2中并不叫此称谓但用法类似),全文索引(仅使用在MYISAM引擎)外,还存在特殊的空间索引.空间索引主要利用在GIS,几何数学计算等方面. DB2中没有空间索引,SQLSERVER中存在空间索引,但用法上跟MYSQL略有不同.
3. 视图,系统表.
应用视图没什么可说的,三者创建语句都基本一致.系统表也差不多,每个数据库基本都提供系统表去查询当前数据库中应用数据库的系统信息,比如表结构,表名,表的物理信息,SCHEMA信息,用户信息,约束信息,存储过程信息等等. SQLSERVER还提供了动态管理视图(DMV), DBA可利用DMV查询当前运行的QUERY,当前TASK利用CPU信息,当前运行最慢的SQL,当前的死锁或阻塞等. DMV对SQLSERVER DBA非常重要,每个DBA都要掌握.
4. 在系统内置函数上,MYSQL,SQLSERVER,DB2基本差不多,常用字符处理函数CONCAT,STRCMP,SUBSTRING,REVERSE,LTRIM,RTRIM,REPLACE等均存在或存在类似功能于MYSQL,SQLSERVER,DB2平台上.
5. 触发器和存储过程:
MYSQL,DB2中触发器上均有对旧表和新表的标识和操作,SQLSERVER上没有.
SQLSERVER上触发器语法中可涉及对列的监控,比如 ‘IF UPDATE(A1)’ 标明如果A1列被更新,则做相应的操作;MYSQL, DB2上没有,只能通过,NEW,OLD比较来实现.
MYSQL触发器的触发级别包括AFTER和BEFORE,SQLSERVER包括 AFTER和INSTEAR OF,DB2则包含这三种.
MYSQL触发器语法中包含’FOR EACH ROW‘这种显示触发器颗粒度语句,SQLSERVER触发器语法上没有,但实际执行也是遵循’FOR EACH ROW’. DB2 上还有’FOR EACH STATEMENT’选项,不过仅适用于激活级别是AFTER的时候.
存储过程创建语法,调用目的,编译基本都差不多,只不过调用方法SQLSERVER 用’EXEC‘,MYSQL和DB2上用’CALL’而已. 目前据知乎消息,阿里这种国内顶尖互联网公司已经内部禁止使用存储过程了(我没有亲见,争取过几年进阿里感受感受).
6. 数据类型:
MYSQL中数据类型INT,SMALLINT等整型后面可加数字,该数字表示显示的宽度,但该宽度并不影响实际取值范围.比如INT(4),如果输入不到4位的,会用空格填充;大于4位的,大于4的,显示其实际数值. DB2,SQLSERVER中没有这种所谓数据类型宽度的设计.
MYSQL 的日期时间类型比SQLSERVER,DB2都丰富.
SQLSERVER中的日期时间类型有: DATA,TIME,DATATIME;
DB2中的日期时间类型有: DATA,TIME,TIMESTAMP;
MYSQL中的相关日期时间类型有: YEAR,DATE,TIME,DATETIME,TIMESTAMP
另外 : YEAR类型上 MYSQL 对4位数字或字符,2位数字,2位字符的处理方式不同,具体可参照说明文档.
7. MYSQL中可以使用语句手动更改数据引擎;SQLSERVER,DB2中没有这一设置. (SQLSERVER针对不同的服务提供不同的引擎,比如对分析服务提供的引擎就与基本管理服务中不一样. DB2统一使用默认的引擎)
8. 其他一些SQL查询的细节:
MYSQL 插入新列支持将新列插入到最前面(参数FIRST)或某指定字段的后面(AFTER), SQLSERVER,DB2默认只允许新列插入到最后. SQLSERVER中允许使用设计图形界面将新列插入到某列后面,实际原理是先生成一个和修改后的表一样的临时表,将原来的表中的数据放到临时表中,再将原来的表删掉.(辛苦了,SQLSERVER-_-!)
MYSQL中支持RENAME语句直接将表名改为另一个名字,语法如下:
ALTER TABLE OLDANAME RENAME newname;允许用ALTER TABLE … CHANGE的方式修改列名. CHANGE同样可以修改新列的数据类型.
SQLSERVER中不支持直接用语句修改,允许调用存储过程 ‘sp_rename’去修改表名,同样用该存储过程可以用来修改列名.
DB2中可以用RENAME … TO来修改表名,用ALTER TABLE语句修改表中列名属性,但不允许直接修改列名,只允许删除后添加不同列名的方式.
MYSQL中使用LIMIT关键字查询表中开头或从m行开始的n行数据,SQLSERVER中支持TOP关键字以查询开头多少行的数据,DB2中使用’FETCH FIRST n rows only’来查询开头多少行的数据. 后两者并不支持简单用QUERY 语句去查询m行开始的n行数据(目前的个人看法)
9. 其他一些设置,如运算符,约束,系统函数大致一样.