2017-04-09 17 views
0

テーブルとorder_byの間でジョインを使用する複雑なクエリがあります。以下MySQL order_by最適化

サンプル:1秒でORDER_BY仕上げWITHOUT

select distinct `accounts`.`id`, 
    `accounts`.`number_of_listings` as alias_0 
from `accounts` 
left outer join `revenue_item_account_leads` on `revenue_item_account_leads`.`account_id` = `accounts`.`id` 
left outer join `matches` on `matches`.`matchable_id` = `accounts`.`id` 
    and `matches`.`matchable_type` = 'Account' 
where `accounts`.`locale_id` = 1 
    and (
     revenue_item_account_leads.platform_id is null 
     or (revenue_item_account_leads.platform_id != 6) 
     ) 
    and (
     matches.matched_matchable_id is null 
     or (
      matches.matched_matchable_id in (14, 31, 37) 
      and matches.score < 0.75 
      ) 
     or (matches.matched_matchable_id not in (14, 31, 37)) 
     ) 
    and (accounts.number_of_listings > 0) 
order by `accounts`.`number_of_listings` desc LIMIT 25 OFFSET 0 

クエリ。 order_byのWITHクエリは5秒で終了します(本番環境では使用できません)。

accounts.number_of_listingsには既にインデックスがあります。さらに、私たちが参加している関連性に関する指標もあります。

これを改善する方法はありますか?

+0

'EXPLAIN SELECT ... 'と' SHOW CREATE TABLE'を提供してください –

答えて

0

は、次のクエリ

select distinct `accounts`.`id`, `accounts`.`number_of_listings` as alias_0 
from `accounts` 
left outer join `revenue_item_account_leads` 
    on `revenue_item_account_leads`.`account_id` = `accounts`.`id` 
    and revenue_item_account_leads.platform_id = 6 
left outer join `matches` 
    on `matches`.`matchable_id` = `accounts`.`id` 
    and `matches`.`matchable_type` = 'Account' 
    and matches.matched_matchable_id in (14, 31, 37) 
    and and matches.score >= 0.75 
where `accounts`.`locale_id` = 1 
    and accounts.number_of_listings > 0 
    and revenue_item_account_leads.platform_id is null 
    and matches.matched_matchable_id is null 
order by `accounts`.`number_of_listings` desc LIMIT 25 OFFSET 0 

そして、これらのインデックスを試してみてください。

accounts(locale_id, number_of_listings, id) 
revenue_item_account_leads(account_id, platform_id) 
matches(matchable_id, matchable_type, matched_matchable_id, score) 

あなたの関係やデータに応じて、あなたもDISTINCTキーワードを必要としない場合があります。