`
it农民
  • 浏览: 28767 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Mysql(SaaS)数据库设计

阅读更多

MyISAM存储引擎
MyISAM是默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL 5.1不支持ISAM)。

每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

要明确表示你想要用一个MyISAM表格,请用ENGINE表选项指出来:

CREATE TABLE t (i INT) ENGINE = MYISAM;

注释:老版本的MySQL使用TYPE而不是ENGINE(例如,TYPE = MYISAM)。MySQL 5.1为向下兼容而支持这个语法,但TYPE现在被轻视,而ENGINE是首先的用法。

一般地,ENGINE选项是不必要的;除非默认已经被改变了,MyISAM是默认存储引擎。

如下是MyISAM存储引擎的一些特征:

· 所有数据值先存储低字节。这使得数据机和操作系统分离。二进制轻便性的唯一要求是机器使用补码(如最近20年的机器有的一样)和IEEE浮点格式(在主流机器中也完全是主导的)。唯一不支持二进制兼容性的机器是嵌入式系统。这些系统有时使用特殊的处理器。

先存储数据低字节并不严重地影响速度;数据行中的字节一般是未联合的,从一个方向读未联合的字节并不比从反向读更占用更多的资源。服务器上的获取列值的代码与其它代码相比并不显得时间紧。

· 大文件(达63位文件长度)在支持大文件的文件系统和操作系统上被支持。

· 当把删除和更新及插入混合的时候,动态尺寸的行更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块来自动完成。

· 每个MyISAM表最大索引数是64。 这可以通过重新编译来改变。每个索引最大的列数是16个。

· 最大的键长度是1000字节。这也可以通过编译来改变。对于键长度超过250字节的情况,一个超过1024字节的的键块被用上。

· BLOB和TEXT列可以被索引。

· NULL值被允许在索引的列中。这个占每个键的0-1个字节。

· 所有数字键值以高字节为先被存储以允许一个更高地索引压缩。

· 当记录以排好序的顺序插入(就像你使用一个AUTO_INCREMENT列之时),索引树被劈开以便高节点仅包含一个键。这改善了索引树的空间利用率。

· 每表一个AUTO_INCREMEN列的内部处理。MyISAM为INSERT和UPDATE操作自动更新这一列。这使得AUTO_INCREMENT列 更快(至少10%)。在序列顶的值被删除之后就不能再利用。(当AUTO_INCREMENT列被定义为多列索引的最后一列,可以出现重使用从序列顶部删 除的值的情况)。AUTO_INCREMENT值可用ALTER TABLE或myisamch来重置。

· 如果数据文件中间的表没有自由块了,在其它线程从表读的同时,你可以INSERT新行到表中。(这被认识为并发操作)。自由块的出现是作为删除行的结果,或者是用比当前内容多的数据对动态长度行更新的结果。当所有自由块被用完(填满),未来的插入又变成并发。

· 在MyISAM索引文件里又一个标志,它表明表是否被正确关闭。如果用--myisam-recover选项启动mysqld,MyISAM表在打开得时候被自动检查,如果被表被不恰当地关闭,就修复表。

MyISAM也支持下列特征:

· 支持true VARCHAR类型;VARCHAR列以存储在2个字节中的长度来开始。

· 有VARCHAR的表可以有固定或动态记录长度。

· VARCHAR和CHAR列可以多达64KB。

· 一个被搞乱的已计算索引对可对UNIQUE来使用。这允许你在表内任何列的合并上有UNIQUE。(尽管如此,你不能在一个UNIQUE已计算索引上搜索)。
那些数据表适合MyISAM存储引擎
要考虑这个问题,首先的考虑数据表的锁粒度,什么是锁粒度,简单意义理解就是数据修改或者写入加锁的范围,一般有三种粒度
一:在操作数据表上加锁;
二:在操作数据行上加锁;
三:在字段上加锁。
至 于详细的解释,可以看数据库原理一书和相关的资料,锁本身还包含独占锁(X)和共享锁(S),我们下边提及的锁都是独占锁,锁的粒度大小和并发成反比,这 个道理应该很容易理解,如果锁加在表上,当有一个进程在修改某行的时候,其他修改进程只有等待,因为该表已经被独占,如果锁加在行上,一个进程修改某行的 时候,其他的进程还可以修改其他的行,因为数据表是公开,只是某行被独占。MyISAM存储引擎就是第一种锁粒度,很明显这样存储引擎对并发上支持不是很 理想,上边介绍了MyISAM,该表就是共享读,独占写,他的特点就是速度快,被cache的几率高。我们在设计数据表的时候,就要考虑该表的应用,发生 并发写入的高不高,举例:租户表,就很适合MyISAM,他写入很少,并发写入很低,同理组织架构、角色、权限这些数据表都有同样的特点,SAAS是多租 户系统,但是企业的角色和组织架构一旦写入更改的几率很小,所以并发也很低,更多的业务应用,只需要读该信息。反过来业务数据表就不适合,比如订单表,每 个租户随时都有可能产生新的订单,或者是对订单进行维护和跟踪,在多租户系统下并发很高,是很明显了,这样的数据表就应该按照事务数据表进行设计。


InnoDB存储引擎
InnoDB 给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个 Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空 间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。

InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。

InnoDB 存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。 InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在 分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。

InnoDB默认地被包含在MySQL二进制分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的默认表。

InnoDB 被用来在众多需要高性能的大型数据库站点上产生。著名的Internet新闻站点Slashdot.org运行在 InnoDB上。Mytrix, Inc.在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的负荷。
那些数据表适合InnoDB存储引擎
手 册上很详细的介绍,上边已经说锁的三种粒度,InnoDB就是第二种,行锁定,所以我们设计数据表的时候,要考虑该数据表的X锁频率,简单的说在这个表上 insert,update,delete操作多不多,如果很频繁就考虑用InnoDB存储引擎。第二种情况,上边的介绍说了她的存储文件是一个,可以支 持到T,根据这个特性,如果我们的一个数据表预估很大的话,也应该选择此存储引擎,文件在一起检索的时候减少磁盘的寻道时间,提高性能。当然可伸缩性的 Mysql中,还有很多可选参数进行优化,这个就是DBA和系统管理员的工作了。很多业内人士很担心使用Mysql,主要原因是MyISAM优势在设计 WEB数据库,而企业 级应用的时候只有选择InnoDB,但是InnoDB的版权在oracle手中,作为我们一个应用层上的用户,服务是肯定要考虑的,但是不是我们唯一考 虑, 实际上有很多种方法可以避免数据库崩溃带来的灾难,第一;Mysql有主从模式,这个就是一个相当不错的备份;第二:我们可以建立一个同步服务器,同步 Mysql的数据库文件(hotcopy),怎么建立呢,设置好Mysql的数据表存储盘,同步该盘下db文件,这个工具在linux和BSD下很多,性 能也非常理想。
分区存储(只有Mysql5.1以上的版本才支持)
SQL标准在数据存储的物理方面没有提供太多的指南。SQL语言的使用 独立于它所使用的任何数据结构或图表、表、行或列下的介质。但是,大部分高级数据库管理系统已经开发了一些根据文件系统、硬件或者这两者来确定将要用于存 储特定数据块物理位置的方法。在MySQL中,InnoDB存储引擎长期支持表空间的概念,并且MySQL服务器甚至在分区引入之前,就能配置为存储不同 的数据库使用不同的物理路径。

分区又把这个概念推进了一步,它允许根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分。实际 上,表的不同部分在不同的位置被存储为单独的表。用户所选择的、实现数据分割的规则被称为分区函数,这在MySQL中它可以是模数,或者是简单的匹配一个 连续的数值区间或数值列表,或者是一个内部HASH函数,或一个线性HASH函数。函数根据用户指定的分区类型来选择,把用户提供的表达式的值作为参数。 该表达式可以是一个整数列值,或一个作用在一个或多个列值上并返回一个整数的函数。这个表达式的值传递给分区函数,分区函数返回一个表示那个特定记录应该 保存在哪个分区的序号。这个函数不能是常数,也不能是任意数。它不能包含任何查询,但是实际上可以使用MySQL 中任何可用的SQL表达式,只要该表达式返回一个小于MAXVALUE(最大可能的正整数)的正数值。分区函数的例子可以在本章后面关于分区类型的讨论中 找到。

下边到我们的正题,上边是一些基本知识,saas是一个多租户系统,功能肯定是越来越强大,所以96年提出的soa设计模式就 非常适用,加上IBM等公司已经出了sca的标准,在软件架构上就不用多说,按照专家们的思路是最合适的。实际上微软他们出了saas数据设计的解决方 案,但是个人觉得不是很理想,或者说是用mysql架构不理想。因为saas面临的问题就是用户的数据库安全,现在提出的概念是数据隔离,微软的观点是 schema隔离,schema和数据库用户是一对一的关系,简单的理解就是拥有资源的用户,在oracle和db2中的有详细的介绍,这样可以解决数据 逻辑层的隔离,事实上物理层并没有解决,为什么呢?在oracle或者是db2的时候,创建一个新的数据表还要定义存储空间,如果不定义的话就会是默认空 间,那就是说不同schema的数据表有可能存储在同一个数据空间中。说到这里要打断一下,我个人觉得,有点多余,为什么呢?数据不安全是那些因素造成 的?软件系统的bug?还是操作系统的漏洞被人劫持了,如果是前者我们应该升级我们的软件,如果是后者那数据存在那里都不安全了,和软件服务器有关的所有 设备都有可能被黑掉。所以我他这个隔离schema的做法是忽悠用户的,虚拟主机就这样的原理。阿里提出的数据库架构,就有点类似上边的分区概念,没有什 么实际参考价值。

soa的设计模式不单单可以应用到软件架构,数据库架构同样是有效的,为什么?实际上大型网站已经在用了,比如单点登录 通行证技术,就是soa的一个典型应用,专门用数据库储存用户信息进行登录校验。想象saas每个租户之间的数据有没有可能进行共享,这个是一个要点,每 个租户的并发有多少,是另一个要点。理想的模式,从成本角度考虑,我们可以采用上边的分区进行处理,分区条件的就用租户进行hash,安全角度每个租户有 单独的db磁盘空间,实际上我们还要考虑一个问题就是负载,所以理想的应该是高并发的用户有独立的db,低并发的用户共享db用分区进行实现,这样不管是 从那个层面都可以说的过去。而每个服务都应该这样设计,形成一个数据库节点树,每个节点都可以向外扩展,比如说登录服务器用户数太大了,我们就可以集群, 也就是单点(节点)集群,或者是按需集群,这样也可以降低初次投入成本,当然有钱就另当别论了,全部集群是最好的了。这里就会有一个问题,那每个点上都有 多个数据库,维护起来不是很麻烦啊,答案是肯定的。但是并不是说没有解决的方法,做大型web的人应该都知道光纤存储,有人也叫磁盘隐射,做一个统一的存 储整列,划分存储空间,我们管理员只需要维护这个磁盘整列就成了,至于其他的数据库服务器只是起到分布式计算机中共享内存和共享CPU的作用。

 在 看看mysql的性能,mysql的官方说InnoDB可以支持每秒800次的写入,这个数据的话,就非常不错了,但是实际上在pc服务器上mysql的 并发表现的并不是很好,而且数支持数据的能力也不是很好,估计和优化有很大关系,总体来说mysql还是一个百万级的数据库,但是并不是说小数据库就没有 大作为,google就是一个优秀的mysql用户。saas的并发高低还不能像web那样去计算,网站有1000w的注册用户也许就10w是活跃用户, 而saas不一样,他和企业的生产和工作离不开,所以有10w租户的时候,可能会有100w的活跃用户,我们姑且每个公司有10个员工,所以他的并发很难 预测,如果我们的数据库不支离持动态分的话,后果是不堪设想的。个人觉得saas数据库选择mysql是最明智的,如果是oracle,服务费那是相当可 观的。采用mysql和上边的soa架构思路,我想没有解决不了的负载和安全问题。
     作为一个相对比较完美的系统,每个设计人员不能只顾自己的问题,要考虑到其他同事或者是工作人员的问题,就像saas设计数据库,完全分布式是最好的,但 是维护起来成本是很高,千万不要想我就是一个打工的,设计完了就完了,这样一点协作意识都没有,设计的系统只能的被别人点评一无是处,最后系统从头再来, 劳命伤才。

2
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics