タグ

ブックマーク / siguniang.wordpress.com (3)

  • Redisでオートコンプリート (1)前方一致

    まずは一番シンプルな実装。 SQL の % 部分一致の KVS 版。 サジェスト時には、全キーを取得し(LRANGE)、検索文字列と前方一致するキーを候補として返す。 LRANGE の計算量は O(StartOffset+NumberOfElement) のため、キーが増えるとスケールしない。 キーの追加 候補となるキーを LPUSH で追加する。 > lpush key foo (integer) 1 > lpush key bar (integer) 2 > lpush key baz (integer) 3 サジェスト LRANGE key 0 -1 で全キーを取得する。 > lrange key 0 -1 1) "baz" 2) "bar" 3) "foo" あとは、各キーが検索文字列と前方一致するかチェックし、一致すればサジェスト候補で返す。 References Josiah

    Redisでオートコンプリート (1)前方一致
  • RedisのHash型を活用するとメモリ使用量が激減

    ユーザ情報のように ID をキーにした大量のデータを Redis で管理する場合、ひと工夫して Hash 型を使うと、単純に string 型を使った場合に比べてメモリ使用量が激減することを教わったので、追試してみた。 データモデル String 型を使う 各 ID のデータを Redis で管理する場合、素直にやるなら string 型で保存する。 > set object:123456 val123456 OK > get object:123456 "val123456" 非常に原始的なキーとバリューのペア。 Hash 型を使う Redis 2.2 以降では hash が機能改善され、フィールド数が一定数におさまり、フィールドのデータが一定サイズに収まると、メモリ使用量が平均して 1/5 に軽減されている。 Special encoding of small aggregate da

    RedisのHash型を活用するとメモリ使用量が激減
  • MySQLのLIKEが遅い

    検索ボックスから入力すると WHERE column_name LIKE "%foo%" というような部分一致検索する機能があり、この処理が非常に遅い。 % で始まる LIKE はインデックスを使えないから。 データベースが MySQL 5.1(InnoDB) の場合に、これをはやくするアプローチを考えてみる MySQL の設定を見直す 設定がデフォルトのままだったら、チューニングする。 ベースとなる設定 http://blog.nomadscafe.jp/2012/10/mysql-mycnf-github.html SQL を見直す explainで実行計画を確認し LIKE 以外の箇所で改善点がないか見直す。 今回のケースでは、サブクエリーがフルスキャンしていたので、インデックスを追加して3000倍達成。 前方一致検索にする インデックスが使えるように、部分一致検索(LIKE "%f

    MySQLのLIKEが遅い
  • 1