私はでスタートするには、このクエリを持っていた:JOINSをより速くするには?
SELECT DISTINCT spentits.*
FROM `spentits`
WHERE (spentits.user_id IN
(SELECT following_id
FROM `follows`
WHERE `follows`.`follower_id` = '44'
AND `follows`.`accepted` = 1)
OR spentits.user_id = '44')
ORDER BY id DESC
LIMIT 15 OFFSET 0
このクエリを実行するのに10ms
かかります。
しかし、私は単純結合追加すると:これは11x
増加した時間を実行
SELECT DISTINCT spentits.*
FROM `spentits`
LEFT JOIN wishlist_items ON wishlist_items.user_id = 44 AND wishlist_items.spentit_id = spentits.id
WHERE (spentits.user_id IN
(SELECT following_id
FROM `follows`
WHERE `follows`.`follower_id` = '44'
AND `follows`.`accepted` = 1)
OR spentits.user_id = '44')
ORDER BY id DESC
LIMIT 15 OFFSET 0
。今すぐ実行するには、120ms
がかかります。面白いのは、LEFT JOIN
という句またはのうちORDER BY id DESC
のいずれかを削除すると、時間は10ms
に戻ります。
私はデータベースに新しいので、私はこれを理解していません。なぜこれらの句のいずれかを削除すると、それをスピードアップするのはなぜですか?11x
?そして私はそれをそのまま保つことができますが、それをより速くすることができますか?
私はそれぞれの表のspentits.user_id
,follows.follower_id
,follows.accepted
およびprimary ids
にインデックスを持っています。
はEXPLAIN:
1 PRIMARY spentits index index_spentits_on_user_id PRIMARY 4 NULL 15 Using where; Using temporary
1 PRIMARY wishlist_items ref index_wishlist_items_on_user_id,index_wishlist_items_on_spentit_id index_wishlist_items_on_spentit_id 5 spentit.spentits.id 1 Using where; Distinct
2 SUBQUERY follows index_merge index_follows_on_follower_id,index_follows_on_following_id,index_follows_on_accepted
index_follows_on_follower_id,index_follows_on_accepted 5,2 NULL 566 Using intersect(index_follows_on_follower_id,index_follows_on_accepted); Using where
EXPLAIN PLANとは何ですか? –
@DavidJashiがEXPLAINで更新されました – 0xSina