写点什么

Wix 是如何把 MySQL 当 NoSQL 用的

  • 2015-12-22
  • 本文字数:1680 字

    阅读完需:约 6 分钟

近年来,NoSQL 引擎已经成为主流。许多开发人员都将 NoSQL 引擎(如 MongoDB、Cassandra 或 Redis)作为构建应用程序的首选。Yoav Abrahami 是免费建站平台 Wix 的首席架构师。他认为,MySQL 是一个更好的 NoSQL 选项,理由是:MySQL 是一个可靠的引擎,有大量的在线资料可供参考,而且作为键 / 值存储,能够提供卓越的性能、易用性和稳定性。近日,他用 Wix 的实践证明了这一观点。

当用户点击指向 Wix 站点的链接时,浏览器会向 Wix 服务器发送一个 HTTP 请求。服务器会执行一次键 / 值查找,将 URL(Yoav 将其成为路由)解析成一个站点,并加载该站点。由于站点可能暴露到多个路由上,所以路由与站点之间是多对一的关系。站点对象本身有一个复杂的结构,包含两个子对象列表。下面是在标准 SQL 数据库中记录上述对象的一个规范化模式:

在这样一个传统模型中,为了在更新站点的时候保持数据一致性,需要使用事务同时对多个表进行更新。事物会使用数据库级锁阻止并发写入。而且,这个模型中的每个表都有“序列键(serial key)”、外键,路由表的 URL 字段上建有索引。这个模型有如下几个问题:

  • 锁限制了表的访问,在吞吐量比较高的情况下,会影响性能;
  • 读取一个对象需要数个 SQL 查询或多个表关联,会增加延迟;
  • 序列键会使用锁,再次限制了写吞吐量。

这些问题限制了 MySQL 的吞吐量和并发性。考虑到这实际上是一个键 / 值存储场景,许多开发人员会优先考虑寻找一种 NoSQL 解决方案。但在 Wix,他们创造性地将 MySQL 当作一个键 / 值存储来用,而且取得了很好的效果。例如,读延迟平均只有 1~1.5 毫秒 。这一延迟可以同大多数键 / 值存储引擎相媲美。

以下是他们实际使用的数据库模式:

复制代码
CREATE TABLE `routes` (
`route` varchar(255) NOT NULL,
`site_id` varchar(50) NOT NULL,
`last_update_date` bigint NOT NULL,
PRIMARY KEY (`key`),
KEY (`site_id`)
)
CREATE TABLE `sites` (
`site_id` varchar(50) NOT NULL,
`owner_id` varchar(50) NOT NULL,
`schema_version` varchar(10) NOT NULL DEFAULT '1.0',
`site_data` text NOT NULL,
`last_update_date` bigint NOT NULL,
PRIMARY KEY (`site_id`)
) /*ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=16*/;

任何不在查询条件中使用的字段都并入一个 Blob 字段(site_data 字段)。另外,使用 varchar2(50) 取代了序列键,用于存储客户生成的 GUID 值。这样,使用下面的查询就可以查找 HTTP 请求对应的站点:

复制代码
select * from sites where site_id = (
select site_id from routes where route = ?
)

该查询首先通过唯一索引查找站点标识,然后通过主键查找对应的站点,只需访问一次数据库就可以完成请求解析,可以提供很高的吞吐量和很低的延迟。在这种模式下,更新甚至都不需要事务,因为在一个插入语句中插入整个站点的信息后,该信息在路由插入之前并不会被读取。

根据从上述实例中获取的经验,Yoav 对如何将 MySQL 用作 NoSQL 引擎进行了总结。首先,要避免使用数据库锁或复杂查询:

  • 不要使用事务,那会引入锁,使用“应用事务(applicative transactions)”代替;
  • 不要使用序列键,那会引入锁,使双活配置复杂化;
  • 使用客户端生成的唯一键。

其次,在设计数据库模式时要专门针对数据读取操作进行优化:

  • 不要规范化;
  • 只保留索引字段,其他字段存入 Blob/text 字段;
  • 不要使用外键;
  • 模式设计要支持单行查询;
  • 不要执行 alter 命令。

最后,在查询数据时要遵循如下原则:

  • 通过主键或索引查询记录;
  • 不要使用表连接;
  • 不要使用聚合;
  • 在副本上运行内务处理(如 BI、数据挖掘等)查询,而不要在主数据库上。

总之,MySQL 很适合作为 NoSQL 引擎使用,Wix 将其用作键 / 值存储获得了很好的效果,MySQL 为 Wix 提供了堪与大多数 NoSQL 引擎相媲美的延迟、吞吐量和并发性。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015-12-22 18:005043
用户头像

发布了 1008 篇内容, 共 356.5 次阅读, 收获喜欢 332 次。

关注

评论

发布
暂无评论
发现更多内容

OceanBase大事记(2023年3月)

OceanBase 数据库

数据库 oceanbase

拒绝“爆雷”!GaussDB(for MySQL)新上线了这个功能

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

编码的未来是根本不需要编码

引迈信息

前端 低代码 JNPF

使用卷积神经网络实现图片去摩尔纹

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 3 月 PK 榜

Whats's New In Seata 1.6.x

阿里巴巴云原生

阿里云 开源 云原生 seata

护航应用的“全科医生”,神州云科亮相四川卫生健康信息技术交流大会

云科通明湖

在 Rainbond 上使用 Curve 云原生存储

北京好雨科技有限公司

云原生 kubernete 分布式存储 rainbond

直播揭秘,人人都在聊的AI技能究竟怎么学?

科技热闻

Qualcomm QCA9880 MAXON MX530VX MIMO Mini PCIE WiFi5 Module

MAXON

QCA9880

浅谈开源测试平台RunnerGo的使用体验

爱研究代码的极客人

软件测试 Jmeter 性能测试 压力测试 runnergo

在Github上标星103K爆火的Spring Security手册及源码笔记,YYDS

程序知音

Java spring security Java进阶 后端技术 java 架构

作业帮基于明道云开展的硬件业务数字化建设

明道云

跨越前后端排障鸿沟,精准排障,让IT人员不“撕逼”

嘉为蓝鲸

告警 后端技术 IT 运维

嘉为蓝鲸研发运营一体化解决方案入选金融信创优秀解决方案

嘉为蓝鲸

金融 解决方案 一体化

云服务过载控制的前世今生

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

MobTech MobPush|用户行为分析

MobTech袤博科技

玩转 ChatGPT+极狐GitLab|自动化的MR 变更评审来了

极狐GitLab

DevOps Code Review 极狐GitLab 代码合并 ChatGPT

低代码平台助力AIGC:让人工智能技术更加普及和高效

加入高科技仿生人

人工智能 低代码 AIGC 人工智能技术

MobTech SMSSDK|短信验证服务

MobTech袤博科技

Principle for Mac(交互式原型设计工具) v6.29.6免激活版

真大的脸盆

Mac 交互设计 Mac 软件 交互式产品原型设计工具

如何构建用户体验优化体系?

嘉为蓝鲸

IT运维 用户体验设计 用户体验分析

Wix是如何把MySQL当NoSQL用的_数据库_谢丽_InfoQ精选文章