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设计数据库,完全分布式是最好的,但
是维护起来成本是很高,千万不要想我就是一个打工的,设计完了就完了,这样一点协作意识都没有,设计的系统只能的被别人点评一无是处,最后系统从头再来,
劳命伤才。
分享到:
相关推荐
快速搭建专属电商系统,内置多租户saas等功能,方便迅速展开业务,安全便捷,框架成熟稳定便于扩展,支持二次开发定制。 环境必备 Jdk8+ Mysql5.7+ Maven Lombok(重要) 软件架构 核心框架:Spring Boot 2.4.0 安全...
SASS版ERP进销存管理系统多商户多门店多仓库源码:扫描入库+库存预警+仓库管理+商品管理+供应商管理。 1、电脑端+手机端,手机实时共享,手机端一目了然。 2、多商户Saas营销版 无限开商户...测试环境:php5.6+mysql5.6
Learn how to use general table space to suit the SaaS or multi-tenant applications Analyze slow queries using performance schema, sys schema and third party tools Manage and monitor your MySQL ...
SAPI 是微信小程序、公众号SaaS运营平台,基于ThinkPHP EasyWecaht。集成同城锁客宝、城市号、售后宝、点餐宝、商城等微信小程序、公众号应用。 sapi框架安装步骤: 1、下载框架,保存到电脑 2、创建站点、运行环境...
SpringBoot 毕业设计,...数据库:MySql(建议用 5.7,8.0 有时候会有坑) 部署环境:Tomcat(建议用 7.x 或者 8.x b版本),maven 2. 部署 如果部署有疑问的话,可以加 vx呀: Albert_HW07 咨询, 备注:咨询-昵称
在此基础上,MySQL 5.6 进行了全方位的改进,旨在让富于创新的 DBA 和开发人员能够在最新一代的开发框架和硬件平台上创建和部署下一代 Web、嵌入式和云计算/SaaS/DaaS 之应用程序。 简而言之,MySQL 5.6 只是 MySQL ...
测试环境:php5.6+mysql5.6 1、修改数据库配置文件 App\Conf\db.php 2、导入数据库文件 用户:admin 密码:www.jocat.cn https://czqixidi.com/wp-content/uploads/2023/08/image-118-613x1024.png
3. 数据库采用MySQL,支持分布式部署; 4. 采用RESTful API实现前后端分离,降低耦合度; 5. 提供丰富的API接口,方便二次开发和集成。 本系统旨在为用户提供高效、便捷、安全的办公体验,帮助企业提高工作效率和...
SaaS智能分析 画像关系 智能分析-应用 智能分析-数据库 SQL、Table等兼容性详细分析 第二阶段: 实施协助(工具和手册) 业务改造-studio部署 ADAM配套能力 SQL溯源分析与建议 PL/SQL 转Java PLSQL转JAVA难点 ADAM ...
Java 项目,包含:项目源码、数据库脚本、部署说明等,该项目可以作为课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 一. 技术组成 ...
Nginx/Apache/IIS PHP7.1+ MySQL5.6+ 建议使用环境:Linux + Nginx1.14 + PHP7 + MySQL5.6 保存数据库账号和密码 3、上传下载好的框架文件,解压到根目录 4、复制/sapixx/src下的文件到根目录 5、设置运行目录到...
创建MySQL数据库 CREATE SCHEMA ` weixin_mp_saas ` DEFAULT CHARACTER SET utf8mb4 ; 生成的jar包 mvn clean package -Dmaven.test.skip=true 启动服务 java -jar any-share.jar 配置项 server.port服务端口号,...
MySQL是当今使用的最受信任和使用最广泛的开源数据库平台。在全球排名前十的最流行和流量最大的网站中,有十个依赖MySQL。MySQL 8.0通过提供全面的改进来建立这种势头,这些改进旨在使创新的DBA和开发人员能够在最新...
进入mysql数据库,创建doodooke数据库 执行命令启动npm run dev,此时会同时启动前端和后端,并且修改前后端代码会自动生效(如果提示强制断开,请联系客服) 打开浏览器访问http://127.0.0.1:3000,会跳转到...
MySQL是当今使用的最受信任和使用最广泛的开源数据库平台。在全球排名前十的最流行和流量最大的网站中,有十个依赖MySQL。MySQL 8.0通过提供全面的改进来建立这种势头,这些改进旨在使创新的DBA和开发人员能够在最新...
suibian 做一个随便一些的saas开发脚手架 ...mysql 开源数据库 react 前端开源 JavaScript MVC 框架 |--sql sql文件 |--src |--main |--java |--base 基础类 |--common 公用提取类 |--config 配置文件
为您提供SAPI++微信SaaS平台下载,SAPI++是...sapi框架安装步骤:1、下载框架,保存到电脑2、创建站点、运行环境:Nginx/Apache/IIS PHP7.1+ MySQL5.6+ 建议使用环境:Linux + Nginx1.14 + PHP7 + MySQL5.6保存数据库账
数据库 : MySQL 开发工具 : phpstrom 源码类型 : WebForm 技术:Thinkphp6.X + Layui2.5 + easywechat4.X 后台:租户管理后台(域名+/manage/member/login)和平台管理后台(域名+/manage/admin/login) 环境(建议使用...