私はこの質問が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
このテーブルで実行している操作:
- ジョブごとに、このテーブルで1つの更新と10の選択クエリがあります。したがって、読み取りと書き込みには高周波が必要です。
- フィルタを実行してこのテーブルを操作しているアプリケーションはたくさんあります。
- _unique_key
- _州
- is_set_stopped
- _ユーザーID
- _dataフィールドのサイズは、アプリケーションのタイプとユーザーに基づいて5KBから1MBまで変化します。
- アプリケーションは選択属性を更新できます。
私たちが考えた解決策:
MySQL InnoDB
高い読み取りと書き込みが必要なため、MySQLは十分に拡張できないと思います。
MySQLインメモリテーブル
このソリューションの問題は、
- 動的フィールドサイズはサポートされていません。MEMORYテーブルは、固定長の行ストレージ形式を使用します。VARCHARなどの可変長タイプは、固定長を使用して格納されます。ソースhttp://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html
- select for .... updateは、テーブル全体をロックします。それが問題になるかどうかはわかりません。
Redis
Redisの外観は良い選択のようです。しかし、私のテーブルはキー値キャッシュサーバーには適していないと思います。
- 非常に多くのデータ型のセットのみをサポートします。リストには文字列しか保存できません。フィールドをJSONまたはその他の形式で保存する必要があります。
- クライアントが特定の属性を更新したい場合は、完全な値をダウンロードしてから、オブジェクトの解析を実行してサーバーに再プッシュする必要があります。 私が間違っているかもしれませんそれを行う方法はありますか?
- 値に基づくフィルタリングはできません。 私が間違っているかもしれませんそれを行う方法はありますか?
TMPFSファイルシステム上のMySQLInnoDB
これは有望に見えます。ただし、メモリテーブルのRedisやMySQLと同様に十分に拡張できるわけではありません。