miałem tę kwerendę, aby rozpocząć się z:Jak zrobić JOINS szybciej?
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
To zapytanie trwa 10ms
wykonać.
Ale gdy dodaję prosty przyłączyć:
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
Tym razem wykonać wzrosła o 11x
. Teraz wykonanie wymaga około 120ms
. Co ciekawe, po usunięciu LEFT JOIN
klauzuli lub z ORDER BY id DESC
, czas wraca do 10ms
.
Jestem nowy w bazach danych, więc nie rozumiem tego. Dlaczego usunięcie którejś z tych klauzul przyspiesza to w górę? Jak mogę zachować go tak, jak jest, ale czy jest to szybsze?
Mam indeksy na spentits.user_id
, follows.follower_id
, follows.accepted
i na primary ids
dla każdej tabeli.
wyjaśnić:
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
Co zawiera EXPLAIN PLAN? –
@DavidJashi zaktualizowany o EXPLAIN – 0xSina