非常に大量の状況に近づいたのはこれが初めてです。これは MySQL ベースの広告サーバーです。ただし、使用されるクエリには多くの JOIN が組み込まれており、通常はただ遅いだけです。(これは Rails ActiveRecord です)
sel = Ads.find(:all, :select => '*', :joins => "ads.campaign_id = キャンペーン.id でキャンペーンに参加 キャンペーン.user_id = users.id でユーザーに参加 LEFT JOIN 国で国に参加.campaign_id = Campaign.id LEFT JOIN キーワード ON キーワード.campaign_id = キャンペーン.id", :conditions => [flashstr + "keywords.word = ? AND ads.format = ? AND キャンペーン.cenabled = 1 AND (countries.country IS NULL OR countries .country = ?) AND ads.enabled = 1 AND Campaigns.dailyenabled = 1 AND users.uenabled = 1", kw, format, viewer['country'][0]], :order => order, :limit =>限)
私の質問:
JOIN をサポートしているが、はるかに高速な MySQL のような代替データベースはありますか? (Postgre があることは知っていますが、まだ評価中です。)
それ以外の場合、MySQL インスタンスを起動し、ローカル データベースをメモリにロードし、5 分ごとに再ロードすることは役に立ちますか?
それ以外の場合、この操作全体を Redis または Cassandra に切り替えて、何らかの方法で JOIN 動作を変更して、NoSQL の (JOIN できない) 性質に一致させる方法はありますか?
ありがとうございました!
編集:ここに詳細があります:
フラット化された選択で完全に実行された SQL (上で切り捨てられています):
SELECT キャンペーン.id、キャンペーン.guid、キャンペーン.user_id、キャンペーン.dailylimit、キャンペーン.インプレッション、キャンペーン.cenabled、キャンペーン.dayspent、キャンペーン.dailyenabled、キャンペーン.fr、ads.id、ads.guid、ads.user_id、ads .campaign_id、ads.format、ads.enabled、ads.datafile、ads.data1、ads.data2、ads.originalfilename、ads.aid、ads.impressions、countries.id、countries.guid、countries.campaign_id、countrys.country 、keywords.id、keywords.campaign_id、keywords.word、keywords.bid FROM
ads
ads.campaign_id = キャンペーン.id でキャンペーンを結合 キャンペーンでユーザーを結合.user_id = users.id 国で左結合 国.キャンペーン_id = キャンペーン.id 左結合 キーワードでキーワードを結合' AND ads.format = 10 AND Campaign.cenabled = 1 AND (countries.country IS NULL OR countries.country = 82) AND ads.enabled = 1 AND Campaigns.dailyenabled = 1 AND users.uenabled = 1 AND ads.datafile ! = '') ORDER BY キーワード.bid DESC LIMIT 1,1
EXPLAIN/実行計画:
+----+-------------+-----------+--------+------------------+-------------+---------+------------------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+--------+------------------+-------------+---------+------------------------------------+------+----------------------------------------------+
| 1 | SIMPLE | keywords | ref | campaign_id,word | word | 257 | const | 9 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | ads | ref | campaign_id | campaign_id | 4 | e_development.keywords.campaign_id | 8 | Using where |
| 1 | SIMPLE | campaigns | eq_ref | PRIMARY | PRIMARY | 4 | e_development.keywords.campaign_id | 1 | Using where |
| 1 | SIMPLE | users | eq_ref | PRIMARY | PRIMARY | 4 | e_development.campaigns.user_id | 1 | Using where |
| 1 | SIMPLE | countries | ALL | campaign_id | NULL | NULL | NULL | 4 | Using where |
+----+-------------+-----------+--------+------------------+-------------+---------+------------------------------------+------+----------------------------------------------+
(これは開発データベース上にあり、本番バージョンほど多くの行はありません。)
定義された指標:
ads -> id (primary, autoinc) + aid (unique) + campaign_id (index) + user_id (index)
campaigns -> id (primary, autoinc) + user_id (index)
countries -> id (primary, autoinc) + campaign_id (index) + country (index) + user_id (index)
keywords -> id (primary, autoinc) + campaign_id (index) + word (index) + user_id (index)
user -> id (primary, autoinc)