我知道这个问题在stackoverflow中被问了多次。我发布这个问题是为了找出我的设计的最佳选择。我的工作详细信息有以下架构。
_unique_key varchar(256) NULL
_job_handle varchar(256) NULL
_data varchar(1024) NULL
_user_id int(11) NULL
_server_ip varchar(39) NULL
_app_version varchar(256) NULL
_state int(11) NULL
_is_set_stopped bool
我们在这张表上做了什么操作:
- 对于每个作业,我们将在此表上进行一次更新和 10 次选择查询。所以我们需要高频读写。
- 有许多应用程序通过对以下内容进行过滤来操作此表:
- _unique_key
- _状态
- is_set_stopped
- _用户身份
- _data 字段大小从 5KB 到 1 MB 不等,具体取决于应用程序和用户的类型。
- 应用程序可以更新选择性属性。
我们认为的解决方案:
MySQL InnoDB
由于对高读写的要求,我认为 MySQL 的扩展性不够。
内存表中的 MySQL
这个解决方案的问题是
- 它不支持动态字段大小。MEMORY 表使用固定长度的行存储格式。VARCHAR 等可变长度类型使用固定长度存储。来源http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html
- select for .... update 它将锁定整个表。不知道会不会有问题。
雷迪斯
Redis 看起来是个不错的选择。但我认为我的表不适合键值缓存服务器。
- 它只支持一组数据类型。我只能在列表中存储字符串。我需要将字段存储为 JSON 或其他格式。
- 如果客户端想要更新特定属性,他们需要下载完整值,然后解析对象并重新推送到服务器。 可能是我错了有没有办法做到这一点?
- 无法根据值进行过滤。 可能是我错了有没有办法做到这一点?
TMPFS 文件系统上的 MySQL InnoDB
这看起来很有希望。但是不要不,它的扩展性足够类似于内存表中的 Redis 或 MySQL。