NoSQLと行・列指向型DBの技術選定

はじめに ログ分析システムを構築するにあたり、ログを格納するDBは何にすればいいのかについて考える機会がありました。 この時、慣れているからという理由だけで行指向型DB(MySQL)を採用するのは非常に危険な考え方です。もし深く考えずに安直な選択をした場合、DBのレコード数が増えて来た頃に1クエリ毎に1分近くも処理時間を待たなければならないという未来を迎えることでしょう。そしてそうなった時には後戻りが出来なくなってしまうのです。 今回はそうならないためにもNoSQLとSQL(行・列指向型DB)の3つを比較しながら、技術選定の観点をかんたんにまとめてみました。 行指向型DB 行指向型DBとはMySQLやPostgreSQLなどの最も一般的なDBです。行単位でレコードを読み書きします。 メリット 少ないレコードへの読み込み・書き込みが速い検索しやすい デメリット レコードが多いほど読み込み(ディスクシーク)が遅くなる HDDとアクセス速度 忘れがちですが、HDDに保存されたデータへのアクセスは結構遅いです。レコードを読み取るということは、すなわち円盤の上のアームが回転して保存された磁気データを探しているということです。 つまりレコードが増えるほど回転量が増えて処理時間も長くなります。 列指向型DB 列単位でレコードを読み取る。列方向はデータ形式が同じで、同値が多いので圧縮保存される。BigQueryなどが代表的。 メリット 大量レコードでも読み込みが速い検索しやすい ※列方向に圧縮して保存するので、HDDのデータシークの観点からレコードが増えても読み込み速度が速い ※クエリは行指向と変わらないので検索しやすい デメリット 書き込みが遅い ※一行であろうと更新する際には、圧縮されたDBを展開してから更新して再度圧縮を行うため時間が掛かる NoSQL NoSQLはキーバリュー型やドキュメント型など種類が多くあります。※ここではAWSのDynamoDBなどで代表的なキーバリュー型を想定しています。 メリット 読み込み・書き込みが速い拡張性が高い ※インデックスキーを登録出来るので該当キーでの読み込みが速いです ※キーバリュー形式で様々なデータを格納出来る インデックス インデックスとは本で言う索引のようなもです。インデックスのロジックはDB毎に様々ですが、ここでは二分探索木をイメージしています。 例えば1,000行のレコードがあるとして、1000番目のレコードを探索する際に頭から順番に検索するのではなく、1~500行目はここ、501行目~1000行目まではここという風にグルーピングされていればより速く検索することが出来ます。 細かい説明は割愛します。 デメリット 検索しにくい設計が難しい ※RDBMSの様な複雑な検索は出来ません。また登録出来るインデックスキーの数に限りがある。 ※どのキーで検索・ソートするのかなど、あらかじめ決めるべき項目が多いため設計が難しい まとめ 各DBの説明は以上です。どのDBを採用するかは、レコード数や検索性、用途や予算などを整理した上で、各データベースの長所と短所を比較しながら選定することになるかと思います。 以上です。 ... 御覧になる | 御シェアする

PostgreSQLからMySQLに移行する方法

はじめに あるアプリケーション内のDBを別のアプリケーションに取り込みたい場合があります。同じミドルウェア同士、例えばMySQLからMySQLなどなら比較的簡単なのですが、異なるミドルウェア同士だと少し手間が掛かります。 頻繁に行う作業ではありませんがその度に調べ直したり検証するのは面倒なので、今回はPostgreSQLからMySQLにDBを移行する方法をまとめました。 概要 大まかな移行の流れは下記になります。 PostgreSQLリストアCSVエクスポートMySQLインポート 味噌はCSV形式で扱うことで汎用性を持たせている点です。 PostgreSQLリストア PostgreSQLコンテナ起動 まずはPostgreSQLコンテナを起動するところから始めていきます。Dockerfileとdocker-compose.ymlを作成します。 ※既にPostgreSQLが動いているアプリケーションがある場合は必要ありません。 FROM... 御覧になる | 御シェアする

MySQLダンプでDBのバックアップを取る

ダンプとは ダンプとは広義では様々な意味を持ちますが、DB界隈ではバックアップを取ることをDBをダンプすると言います。ダンプして生成したファイルをダンプファイルと呼びダンプファイルをインポートすればDBをそのまま復元出来るためとても便利です。 仮にサービスが壊れてしまい復元出来ないことになっても全く新しいコードを書いて同じサービスを作り直すことは比較的容易です。しかしDBが壊れたら復元することは困難を極めます。というよりもほぼ不可能です。だからこそDBのバックアップは必ず取っておくべきであり、手軽に残せるようなサポートが備わっています。今回はMySQLでダンプファイルを作成する方法と、復元する方法をまとめました。 ダンプファイル作成 下記のコマンドを実行すると全テーブル・全レコードのダンプファイルを作成します。 $... 御覧になる | 御シェアする