8 个不得不说的 MySQL 陷阱

MySQL安装简单,速度较快,功能丰富。另外它还是开源运动的标杆,它的伟大成就向我们展示了一个成功的公司是可以建立在开源代码之上的。

然而用过mysql的人都曾对着显示器挥舞过拳头。但你不可能发明一种每秒能保存成千上万行互联网数据,并且一点错误都没有的技术吧。

为了在这个夏天躁起来,我们列举了8个抱怨开源关系型数据库的理由。下面列举的理由中不仅限于 MySQL,有一些是针对关系型数据库的。如果我们没有理清楚关系型数据库和 MySQL,我们将会永远陷入90年代的思想上。我们需要推倒然后重建这些。或者我们转向使用一个最近流行的,存在时间没有长到可以列出一堆像下面一样的理由的数据库。

根深蒂固的bugs

任何大的软件包都有 bug。但稍微深入了解一下,就会发现和 Mysql 相关的 bugs 自成体系。突然你就需要留心,因为 NULL 并不是以同样的方式出现,外键约束也没有像你想像的那样执行,连主键自动增长也会出错。

小问题大量存在,而且并不总是可以修复,这就是为什么一些人保持一个列表。还好 MySQL 维护着一人非常好的 bug 报告系统,让我们可以知道我些我们无法想像的事情,知道其他人也在经受同样的磨难。

关系表的不灵活性

关系表具有条理性,条理性是好的——但是,它使得程序员不得不编造或硬塞一些数据到已经定义好模式的列中。NoSQL开始越来越受到欢迎的原因之一,就是它为程序员提供了足够的灵活性,来加速数据库的使用。如果一个街道地址需要增加一行,那么,你可以将它很容易地插入到一个NoSQL文档中。如果你想添加一个完整的新的数据块,无论它包含什么内容,文档模型也可以原封不动地接受你的数据,而不必改为它要求的数据格式。

试想一下,你用整数格式建立了一个全部是邮编的表格。这个表是十分高效的,它执行的规则也很好。突然一次,有人上传了一个使用了连字符的九位数邮编。或者还有可能,你得到了一位来自加拿大客户的信件,上面写有邮政编码。

这时,一切都乱了。老板要求网站要在几小时内恢复正常工作。然而,现在已经没有时间来重建数据库。程序员可以做什么?也许,可以使用黑客手段把加拿大邮政编码由base64的数字格式改为base 10格式?或者设置一个使用转义编码的辅助表格,用来说明真正的邮政编码或者其他?谁知道呢?到处都有黑客,他们都是危险的。但你没有时间来搞定它。

MySQL的关联规则让每个人都诚实和谨慎,但它能强制我们避开易受攻击和欺骗的麻烦。

JOIN联合查询

曾几何时,将数据分表保存是计算机科学史上的伟大创新。分开后的表不仅结构简单,也简化了使用。但它却需要使用join语句进行查询。

sql通过一系列join构建的复杂查询将开发者推入了困惑与绝望的深渊。而且存储引擎也需要以最优的方式来高效地解析join语句。开发者需要绞尽脑汁编写查询语句,然后数据库对其进行解析。

这就是很多注重运行速度的开发者放弃数据分表转而使用不规范数据表的原因。不区分数据实体,将所有数据保存到一个大表中——以避免复杂的查询。这样确实很快,并且服务器也不会耗尽内存。

磁盘空间现在很廉价。8TB的磁盘已经在售,更大的也要上市了。我们不再需要为使用join而绞尽脑汁了。

分支的混乱

是的,一个可靠的、得到良好支持的MySQL分支,可以带来竞争和选择,但是它也引起困惑和混乱。更糟糕的是,一个称为MariaDB的MySQL分支,由Monty Widenius维护着。他同样也在参与编写MySQL。那么,MariaDB是真正独立的值得我们拥护的吗?或者它是MySQL?我们是否应该坚持使用由创建原始MySQL数据库的组织运营的核心代码?或者我们应该加入那些被认为更聪明的,往往很酷的背叛者?

还有,我们应当如何获得关于兼容性的信息?一方面,我们被确信MariaDB和MySQL十分地相似。另一方面,我们要相信有差异——不然为什么大家都在争论它?也许它们在性能和我们查询的范围内,在两个阵营中工作方式相同?但也许他们不同-或者将来会不同。

存储引擎混乱

MySQL不是事实上的同一的数据库;它由几个数据库组成,它们的大多数细节都被统一的表面所掩盖。在开始的时候,有一个MyISAM引擎,它很快但是在前后一致上不能做到完备。有时候你需要速度并且可以接受不一致的结果时是很好的。

当人们需要更多时,具备完整事务支持的InnoDB出现了。但这还不够。现在,它可能有20种存储引擎的选择——这足以使一个数据库管理员疯狂。当然,有些时候在不同的存储引擎之间切换而不必重写你的SQL是很好的,但是切换后总会带来混乱。这个表格我选择的引擎是 MyISAM 还是 innoDB 呢?或者,我决定输出的数据是CSV格式的吗?

盈利的动机

虽然 MySQL 是一款成功的开源产品,但它仍然是一门生意,里面满是靠它获得薪水的专业开发者。当大多数用户在持续地享受开源许可证带来的最佳体验时,毫无疑问这家公司还在为赚取足够的钱来维持运营而努力。这导致自由代码在“社区版”和出售给企业的完整产品之间产生了奇怪的分岐。

你应该付钱吗?你在这里挣到了多少钱?在社区版之上开展经营行为是否公平?企业版中额外的功能,是否只是一个噱头来引诱我们不断付费呢?这至少说明一点,它是另一组需要回答的问题。选用哪个版本?遵照哪种许可证?选用它的哪个功能集?

版权声明:欢迎转载,希望在你转载的同时,添加原文地址,谢谢配合

时间: 2024-10-27 01:04:11

8 个不得不说的 MySQL 陷阱的相关文章

8个不得不说的mysql陷阱

%E5%86%8D%E8%A7%81googlereader http://www.zcool.com.cn/collection/ZMTcxOTQyNzI?52PJ=704V8 http://www.zcool.com.cn/collection/ZMTY4NTEyMTY http://www.zcool.com.cn/collection/ZMTY5NTQ1NjA=.html http://www.zcool.com.cn/collection/ZMTcyNDA5NzY http://www

Amoeba-mysql读写分离实战

Amoeba用途有很多,这里看标题我们就先说读写分离,因为我也只会这个.Amoeba定义为国内的,开源的.目前(2015年10月20日)我们用amoeba2.2版本来做. 先说一下本人环境: Keepalived那个先不说. Mysql 5.6 Centos 6.4 Mysql一主两从已OK. Amoeba 2.2.x 主从我就不讲了,网上N多资料. Amoeba下载地址:http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20my

LB lvs-nat lvs-dr 的理解及实验

Lvs-nat 负载均衡nat模式工作原理讲解 Lvs是LB 的实现方式 LB :负载均衡 Lvs-nat Directory 负载均衡调度器 Real server 真正负载集群的总称 请求报文 首先客户端请求一个http资源,经过路由器到达directory  的vip 经过路由选择,送到INPUT链上去,INPUT链 查看他的请求资源是个本机,但是本机是个集群,本机并没有web服务提供,根据配置规则,就修改请求资源的目 标地址为真正的real server rip 送给dip,dip查看是

sql数据库查询

-- 2 select A.student_id,A.num as 生物,B.num as 物理 from (select student_id,num,cname from score left join course on course_id = cid where cname = '生物') as A left join (select student_id,num,cname from score left join course on course_id = cid where cna

anaconda环境搭建

下载anaconda直接去官网下载就可了,地址:https://www.anaconda.com/distribution/,选择适合自己电脑的版本 配置环境变量 1,找到python.exe所在的文件,我的是E:\anaconda\anaconda3 2,然后找到一个scripts文件,点击后将路径复制 3,找到环境变量(怎么找具体的就不说,mysql里怎么找环境变量),然后把路径E:\anaconda\anaconda3\Scripts放到系统变量path里,在路径前加上英文的:分号 con

Mysql order by与limit混用陷阱

在Mysql中我们常常用order by来进行排序,使用limit来进行分页,当需要先排序后分页时我们往往使用类似的写法select * from 表名 order by 排序字段 limt M,N.但是这种写法却隐藏着较深的使用陷阱.在排序字段有数据重复的情况下,会很容易出现排序结果与预期不一致的问题. 比如现在有一张user表,表结构及数据如下: 表结构 表数据 现在想根据创建时间升序查询user表,并且分页查询,每页2条,那很容易写出sql为:select * from user orde

mysql 空值的陷阱(转)

转自http://blog.csdn.net/eroswang/article/details/8529817 Mysql数据库是一个基于结构化数据的开源数据库.SQL语句是MySQL数据库中核心语言.不过在MySQL数据库中执行SQL语句,需要小心两个陷阱. 陷阱一:空值不一定为空 空值是一个比较特殊的字段.在MySQL数据库中,在不同的情形下,空值往往代表不同的含义.这是MySQL数据库的一种特性.如在普通的字段中(字 符型的数据),空值就是表示空值.但是如果将一个空值的数据插入到Times

MYSQL培训准备(2):MYSQL自增长陷阱

MYSQL中,在数据库中创建表的语法如下: 1 CREATE TABLE tablename( 2 column_name_1 column_type_1 constraints, 3 column_name_2 column_type_2 constraints, 4 ... 5 column_name_n column_type_n constraints, 6 PRIMARY KEY (column_name) 7 ); 其中,tablename为表名,column_name为列名,col

MySQL之不得不说的keepsync和trysync

此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 开宗明义,keepsync和trysync是网易MySQL分支版本InnoSQL的两个参数,非常重要的两个参数.从某种程度上说,他们决定了MySQL主从复制实例是采用异步复制(async)还是半同步复制(semi-sync).为什么不得不说呢,因为不断有同学问怎么看当前RDS实例是同步还是异步状态,keepsync和trysync这两个参数是干嘛用的,怎么进行设置?于是简单写下semi-sync和这两个参