MySQL大企业级应用可行性分析

我在这里将讨论一些关于MySQL的面向企业级应用的思路,以及能否用MySQL替代当前Oracle的问题。

首先说明一点的是,我不是说MySQL没有大企业级的应用,事实上,可以看到越来越多的成功布署MySQL的应用,但是,还不够多,还有许多大企业的关键应用还不敢用MySQL。或许这篇小文能和大家一起探讨一些比较"虚"的东西。

存储引擎

由于MySQL自己一直没有一个成熟可靠的存储引擎,估计这让他们深感痛处(尤其是目前最成熟的事务型引擎InnoDB又在Oracle手里)。MySQL寄予厚望的Falcon在开发了两年多之后,建树不大,而该项目带头人Jim Starkey前不久又离开了MySQL,陋屋偏逢连夜雨。

Sun会给MySQL一个稳健的引擎么? 我看短时间内未必能达到。除非,Sun从Oracle手里把InnoDB买回来。

如果进行大企业级应用,考虑到引擎本身的稳定性,似乎可选的也只有InnoDB了,但InnoDB的备份工具又是收费的。至于MyISAM,尽管有人的确喜欢用,但对于并发能力要求稍微严格一点,MyISAM根本不行。

在线DDL锁表问题

MySQL中,在线对表对象做DDL操作是要锁表的,对于可用性要求比较高,而应用变化又比较频繁的环境,这是个非常很糟糕瓶颈。没想到有什么好的办法,除非,像大家开玩笑说的,把所有的表都预留出足够的空闲列,减少类似增加列的变更麻烦。

这个MySQL天生的缺陷在PostgreSQL中是不存在的,比如创建索引,可以用create INDEX CONCURRENTLY的方式来减小影响。(MySQL后续的版本中在逐渐改善这个问题:添加了 ONLINE 关键字)

这个看似是个小问题,但实际上却是对很多人最为困扰的。

在线备份问题

MySQL 6.0后终于具备在线备份的能力了。但现在,恐怕比较激进的用户也只能用版本5而已。

很多MySQL资深用户能够根据自己应用的特点布署适合自己的备份方式(尽管可能也会有缺陷,比如基于时间点的恢复)。

至于另一个常用来衡量DB可扩展性的特性:分区,现在MySQL已经能够支持了,尽管实现的的确有点晚。而使用MySQL的用户,一般都采取Sharding的策略对数据进行切分,所以,分区的问题倒似乎并不是最为关键的。

因为是整理思路,这算是这个系列的第一篇。

存储引擎

继续上一篇的讨论,记录针对MySQL在大企业级商用上我的一些零星想法。网络上到处都有关于各个引擎之间的对比。这里要提醒一点是,注意各个引擎的锁的粒度。InnoDB 是行锁,锁的实现是依赖于索引的,MyISAM只是表锁。锁粒度是衡量存储引擎的一个重要指标,其能力很大程度上决定并发能力。

至于TRANSACTION ISOLATION LEVEL,则是另外一个需要衡量的指标。

老生常谈的,某某引擎适合什么类型的应用,归根结底还是由于其实现的机制决定了引擎的特性。

存储层的解决方案

相信没有人愿意在MySQL上用RAW设备,很多人几乎就是直接把数据文件放在文件系统上(个人认为,对于数据库这样的应用来说,文件系统可靠性还有所欠缺)。我还没发现 MySQL上类似Oracle ASM的解决方案。如果用文件系统,单节点的数据存储能力肯定要受到制约--没有人喜欢把几个T的数据扔到一个MySQL DB上吧? 一旦某个文件系统故障,麻烦就来了。从这个角度考虑,或许LVM2是一个可选的方式。

当然,如果把数据文件扔到SAN上也还不错。一方面问题是,现在存储厂商对于MySQL的重视长度还远不如Oracle、DB2等老牌商业数据库。另一方面,很多MySQL用户没有 SAN 环境的,数据都是在本地磁盘上。

固态硬盘与MySQL

前两天有朋友在上一篇分析留言,提及应注重闪存的应用。其实还不如布署固态硬盘(SSD)对MySQL可能的影响问题。 相信现在有很多企业需要在DB的IOPS上寻求突破,SSD是个可能的突破口,但从目前我收集到的数据来看,还没有足够的数据说明启用SSD的MySQL能有预期的数量级上的IOPS提升。

商业支持

现在MySQL的背后有Sun ,但是,如果不购买服务的话,到哪里去找比较正规的商业支持(我是说软件集成商)? 即使购买了服务,如果问题出在存储引擎上,MySQL能给即时、有效的技术响应么? 这也是MySQL没有自有存储引擎的一个弱点,因为衔接的环节多,一旦有商务上的问题,很容易陷入扯皮阶段。

这是这个系列第二篇。如果有第三篇,我倒是想写几点关于MySQL的设想。

时间: 2024-10-30 10:37:49

MySQL大企业级应用可行性分析的相关文章

php 在线导入mysql大数据程序

 php 在线导入 mysql 大数据程序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 <?php header("content-type:text/html;charset=utf-8"); e

MySQL大表中重复字段的高效率查询方法

MySQL大表重复字段应该如何查询到呢?这是很多人都遇到的问题,下面就教您一个MySQL大表重复字段的查询方法,供您参考. 数据库中有个大表,需要查找其中的名字有重复的记录id,以便比较. 如果仅仅是查找数据库中name不重复的字段,很容易 代码如下: SELECT min(`id`),`name` FROM `table` GROUP BY `name`; 但是这样并不能得到说有重复字段的id值.(只得到了最小的一个id值) 查询哪些字段是重复的也容易 代码如下: SELECT `name`,

MySQL大表中重复字段的查询效率方法

MySQL大表重复字段应该如何查询到呢?这是很多人都遇到的问题,下面就教您一个MySQL大表重复字段的查询方法,供您参考. 数据库中有个大表,需要查找其中的名字有重复的记录id,以便比较. 如果仅仅是查找数据库中name不重复的字段,很容易 SELECT min(`id`),`name`     FROM `table`     GROUP BY `name`;    但是这样并不能得到说有重复字段的id值.(只得到了最小的一个id值) 查询哪些字段是重复的也容易 SELECT `name`,c

Mysql大数据量存储及访问的设计讨论

一.引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的问题.通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式.水平切分数据库,可以降低单台机器的负载,同时最大限度的降低了了宕机造成的损失.通过负载均衡策略,有效的降低了单台机器的访问负载,降低了宕机的可能性:通过集群方案,解决了数据库宕机带来的单点数据库不能访问的问题:通过读写分离策略更

MySQL 大数据操作注意事项

MySQL 大数据操作注意事项 http://netkiller.github.io/journal/mysql.parallel.html Mr. Neo Chen (netkiller), 陈景峰(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地518131+86 13113668890+86 755 29812080<netkiller@msn.com> 版权 2011, 2012, 2013, 2014 http://netkiller.github.io 版权声明 转载请与作

求mysql 大数据量问题解决方法?

问题描述 求mysql 大数据量问题解决方法? 一个mysql的数据表(大概有50000+)的数据,其中有一个字段的类型是blob的,存着相当大的二进制数据(大概有50k以上),有时候检索某个字段或者只是查询某个总共有几条数据就要相当长的时间,求有什么办法解决吗? 解决方案 把你经常需要查询的字段建立索引. 解决方案二: blob放在服务器上,然后用mysql记录它存放在服务器的地址.每次查就是根据地址来服务器取数据 解决方案三: MySQL数据库如何解决大数据量存储问题关于mysql大数据量分

php 在线导入mysql大数据程序_php实例

php 在线导入 mysql 大数据程序 <?php header("content-type:text/html;charset=utf-8"); error_reporting(E_ALL); set_time_limit(0); $file='./test.sql'; $data=file($file); echo "<pre>"; //print_r($data); $data_new=array(); $tmp=array(); fore

MySQL 大数据量快速插入方法和语句优化

MySQL大数据量快速插入方法和语句优化是本文我们主要要介绍的内容,接下来我们就来一一介绍,希望能够让您有所收获! 一.INSERT语句的速度 插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: 连接:(3) 发送查询给服务器:(2) 分析查询:(2) 插入记录:(1x记录大小) 插入索引:(1x索引) 关闭:(1) 这不考虑打开表的初始开销,每个并发运行的查询打开. 表的大小以logN (B树)的速度减慢索引的插入. 加快插入的一些方法 如果同时从同一个客户端插入很多行,使用含多个

mysql大内存高性能优化方案

8G内存下MySQL的优化 按照下面的设置试试看: key_buffer = 3840M max_allowed_packet = 16M table_cache = 1024 sort_buffer_size = 32M read_buffer_size = 32M read_rnd_buffer_size = 32M myisam_sort_buffer_size = 256M thread_cache_size = 32 query_cache_size = 256M # Try numb