AI 从业者都在关注的 NVIDIA GTC 2023 China AI Day 来了!报名戳 了解详情
写点什么

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:005013
用户头像

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

关注

评论

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

详解React的Transition工作原理原理

夏天的味道123

React

详细解读 React useCallback & useMemo

夏天的味道123

React

Wallys/IPQ4018/IPQ4028 2x2 2.4Ghz 2x2 5Ghz Industrial WIFI5 router/Support 11ABGN/AC

Cindy-wallys

IPQ4018 IPQ4028 2.4G&5G

浅谈HTTP缓存与CDN缓存的那点事

京东科技开发者

缓存 性能 Web CDN HTTP缓存

vue实战中的一些小技巧

yyds2026

Vue

阿里 CTO 程立:今年双 11,全面深度用云

云布道师

云计算 阿里巴巴 天猫

python中类与对象的动态性,混入机制

乔乔

11月月更

ElasticSearch深度分页详解

京东科技开发者

数据库 elasticsearch 分布式搜索引擎 分布式实时搜索引擎

如何使用ModelBox快速提升AI应用性能

华为云开发者联盟

人工智能 华为云 ModelBox

Apache EventMesh事件驱动分布式运行时

EventMesh布道师

Serverless Faas EDA workflow eventmesh

关于软件物料清单(SBOM),你所需要了解的一切

SEAL安全

安全 软件物料清单 SBOM

HarmonyOS 3.1版本发布,全面进入声明式开发

HarmonyOS开发者

HarmonyOS

解读数仓常用模糊查询的优化方法

华为云开发者联盟

数据库 后端 华为云

数据中台选型必读(五):中台建设本质就是构建企业的公共数据层

雨果

数据中台

可防离职员工冒用身份,合合信息名片全能王与钉钉用数字名片打造安全“围栏”

合合技术团队

人工智能 大数据 钉钉 合合信息 名片

用了8年MQ!聊聊消息队列的技术选型,哪个最香!

小小怪下士

Java RocketMQ RabbitMQ 消息队列

【docker】导入镜像报错磁盘空间不足的解决方法 && 【docker】修改默认的存储路径

A-刘晨阳

Docker Linux 运维 11月月更

vue实战-深入响应式数据原理

yyds2026

Vue

质量评估模型助力风险决策水平提升

百度Geek说

机器学习 企业号十月 PK 榜 智能测试 质量评估模型

Apache Pulsar 社区年度峰会 Pulsar Summit Asia 2022 即将召开

腾源会

大数据 开源

vue实战-完全掌握Vue自定义指令

yyds2026

Vue

引迈信息低代码怎么样?靠谱吗?

优秀

低代码 低代码平台

字节跳动基于ClickHouse优化实践之“资源隔离”

字节跳动数据平台

大数据 Clickhouse

一汽集团数字化转型细节分析:明确如何转型事半功倍

雨果

数字化转型

Linux系统中CPU占用率较高问题排查思路与解决方法

A-刘晨阳

Linux 运维 cpu 11月月更

Linux系统保存文件命令的详细介绍

源字节1号

软件开发 前端开发 后端开发 小程序开发

传统 Web 框架部署与迁移

阿里巴巴云原生

阿里云 Serverless 云原生

zabbix添加自定义监控项&告警(邮件)

A-刘晨阳

Linux 运维 zabbix 11月月更

技术分享| Etcd如何实现分布式负载均衡及分布式通知与协调

anyRTC开发者

分布式 etcd 通知 式负载均衡 协调

会用postman不算牛,会用Eolink才是真的牛

陈橘又青

API

经常被问到的react-router实现原理详解

夏天的味道123

React

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