私はこれが私の質問をする適切な場所であることを願っています。mysqlクエリのサイズ制限ruby/mysql
私のmysqlのクエリは、現在、それはかなり長いクエリだと私はこれらすべてが私の問題を引き起こしている加入怖い私にはこの
@records = Record.find(:all, :select => "`records`.id, records.level as level,
(SELECT (count(b.id) + 1)
FROM records as a, records as b
WHERE a.id = records.id and b.skill > a.skill and b.created_at ='#{vandaag}') as ranktoday,
(SELECT (count(a1.id) + 1)
FROM records as a1, records as b1
WHERE a1.id = timestamp1.id and b1.skill > a1.skill and b1.created_at ='#{timestamp1}') as ranktimestamp1,
records.skill as skill, worlds.title as world, chars.name as name, vocs.voc as vocation, timestamp1.skill as timestamp1",
:conditions => ["`s1`.title = :skill AND `records`.created_at = :vandaag ", {:skill => params[:id], :vandaag => vandaag, :timestamp1 => timestamp1}],
:joins => "
LEFT OUTER JOIN `skilltypes` as `s1` ON `s1`.id = `records`.skilltype_id
LEFT OUTER JOIN `records` as `timestamp1` on `timestamp1`.character_id = `records`.character_id and `timestamp1`.created_at = '#{timestamp1}'
LEFT OUTER JOIN `characters` as `chars` ON `chars`.id = `records`.character_id
LEFT OUTER JOIN `vocations` as `vocs` ON `vocs`.id = `chars`.vocation_id
LEFT OUTER JOIN `worlds` ON `worlds`.id = `chars`.world_id",
:limit => "500",
:order => "`records`.skill DESC"
のように見えます。
もし私が正しいとすれば、orderステートメントはmysqlにテーブルを持つすべてのレコードを結合させ、その結果の後にレコードを最初に注文するのではなく、最初の500個だけを制限してから参加させます。分かるでしょう?
と私は唯一の1000年の記録を持っていたが、現在私は380000件のレコードを持って、毎日、私は別の21000件のレコードを取得していた場合に問題が大きなことではないでしょう。
私の実際の質問は、異なるMySQLクエリで結合を分割する方が良いかどうかをどのように調べるのですか?
mysqlクエリがちょうど混乱して、あなたの笑い声に取り組んでいて、私を馬鹿みたいに見せてくれますか?
ローディング時間がひどいので、私はここでこだわっています。
Greetz、Rikkert
編集: そして私は があるべきだと思うcharacters.world_id、characters.vocation_id、records.character_id、records.skilltype_id、records.skill、records.world_id上のインデックスを持っています十分なGreetz、Rikkert
私はcharacters.world_id、characters.vocation_id、records.character_id、recordsに索引を持っています。skilltype_id、records.skill、records.world_id 私は十分だと思います Greetz、Rikkert –