4

私は現在、MySQLデータベースに大きく依存する2つのiOSアプリケーションを開発中です。それらはそれぞれ、MySQLデータベースからのデータを要求する関連クエリを実行するそれぞれのアプリケーションによって要求される独自のAPIを持っています。

クエリは、単純なもの、ユーザーベース、または「オブジェクト」ベースのものとは異なります。

SELECT `username`, `id`, `full_name` FROM `users` WHERE `id` = 1
INSERT INTO `users` (`full_name`, `username`, `email`, `password`, `signup_method`, `latitude`, `longitude`) VALUES (?, ?, ?, ?, ?, ?, ?)"
SELECT q.*, (SELECT COUNT(a.qid) FROM answers as a WHERE qid=q.id) AS a_count FROM questions as q ORDER BY a_count DESC LIMIT 1, 10

ロケーションベースへ:

SELECT ( 6371 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS distance FROM `users` HAVING distance <= 5 ORDER BY points DESC

SELECT * , (6371 * acos(cos(radians(latitude)) * cos(radians({$values['latitude']})) * cos(radians({$values['longitude']}) - radians(longitude)) + sin(radians(latitude)) * sin(radians({$values['latitude']})))) AS distance FROM `questions` HAVING distance <= ? ORDER by distance LIMIT ?,?

これらのクエリには明らかに時間がかかります。特に後者は、それが引き起こすパフォーマンスの強さによるものです。

多くのサービスは、パフォーマンスを向上させるためにデータベースと一緒にキャッシュレイヤーを使用します。例えば:

  • Memcachd
  • Redis
  • もっと。

私の質問は、クエリに関して、いつキャッシングを使用する必要があるのか​​、そしてキャッシングを使用する利点は何ですか?

ありがとう、

マックス!

4

2 に答える 2

5

結果を最初から生成するよりもキャッシュする方が安い場合は、単純にキャッシュする必要があります。

このコストは、次のようなものによって異なります。

  • さまざまなサーバーやソフトウェアの処理能力。たぶん、dbサーバーの容量は限られていますが、別のサーバーの容量が多すぎます。
  • お金:キャッシュシステムを構築するよりも強力なハードウェアを購入する方が安いですか?
  • ゼロから結果を生成するためのCPUコストとキャッシュのRAMコスト。ほとんどの場合、DBサーバーはCPUにバインドされていますが、キャッシュサーバーはメモリにバインドされています。あなたの場合、どちらがアップグレードするのが安いかを決めるのはあなたです。
  • キャッシュからの取得速度とdbからの取得速度。あなたが言うように、クエリが時間のかかるものであり、キャッシュからそれらを取得する方が安い場合、キャッシュはリクエストをスピードアップします。
  • キャッシュされたアイテムを更新する必要がある頻度。それらが数秒しか続かない場合、それは面倒な価値がないかもしれません。
  • キャッシュされたアイテムを期限切れにして更新するメソッドがあります。これはしばしば非常に難しい問題です。
  • 追加の複雑さを管理するための技術的な知識と時間を持っている。

しかし、常に、ソースから始めてください。MySQLのslow-query-logを調べて、どのクエリにコストがかかるかを確認しましたか?重要なインデックスが欠落している場所や、予想外に時間がかかるクエリを確認するのに役立ちます。[pt-query-digest]Percona-Toolkitの1は、このログファイルを要約することで役立ちます。キャッシュを開始する前に、データベースを最適化してください。

クエリの種類を見ると、結果をキャッシュし、キャッシュを予熱するだけでも十分価値があるように思われます。

もちろん、キャッシュの選択は重要です。MySQLの組み込みクエリキャッシュをすでに使用していると思いますか?有効になっていて、十分なメモリが割り当てられていることを確認してください。'SELECT username'のような単純なクエリはとにかく安価ですが、MySQL自体によって簡単にキャッシュされます。ただし、組み込みのクエリキャッシュには多くの制限があり、クエリがキャッシュされない、またはキャッシュがフラッシュされる理由はたくさんあります。たとえば、関数を使用したクエリ(ロケーションベースのクエリなど)は単にスキップされます。ドキュメントを読んでください。

Redisのようなキャッシュを使用すると、何をキャッシュするか、どのくらいの期間、どのように期限切れにするかをはるかに細かく制御できます。これを実装する方法については多くのアイデアがあり、それらはアプリケーションにも依存します。ネットを見てください。

クエリキャッシュを有効にすることをお勧めします。これは、簡単で安価であり、少し役立つからです。データベースにインメモリキャッシュレイヤーを実装することを検討します。おそらく、ロケーションベースのクエリ用のメソッドが組み込まれているSolrのようなインデックスサーバーを検討する価値があります。MySQLと一緒に使用します。

MemcachedとRedisはキャッシュに適しています。個人的にはRedisを選択します。これは、より多くのユースケースとオプションのディスクへの永続性があるためですが、それは完全にあなた次第です。おそらく、選択のフレームワークには、アプリケーションで使用できる既存のコンポーネントがいくつかあります。

もう1つのヒント:すべてを測定します。何に時間がかかるかを知っている場合にのみ、何を最適化またはキャッシュするかがわかります。また、最適化の結果は、再度測定した場合にのみ明確になります。statsdのようなものを実装し、アプリケーションのさまざまなイベントとタイミングを測定します。十分ではないよりも多すぎる方が良い。結果をグラフ化し、時間の経過とともに分析します。何が起こるか驚くでしょう。

于 2012-07-28T02:04:34.347 に答える
0

キャッシングを使用すると、MySQLクエリを使用するよりもはるかに高速にデータベースにアクセスできます。これは、非常に時間がかかるためです。ほとんどの場合、Webアプリケーションが大きくなると、データベースが最大のボトルネックになり、クエリの速度が速くなるため、多くのバックアップが発生します。その結果、多くのWebサイトや企業は、データベースからの情報へのアクセス速度を上げるための高速で簡単な方法として、キャッシュに頼っています。開発の初期段階では心配する必要はありません。むしろ、アルファ版のWebサイトが稼働しているときに試してみてください。

于 2012-07-28T02:10:42.800 に答える