Det verkar som om, av någon anledning, MySQL
väljer att använda indexet SIL
i den första tabellen och den använder båda för uppslag (WHERE sil_id = 4601038
) och gruppering (GROUP BY cu.Id
).
Du kan säga åt den att använda PK
av bordet
SELECT cu.Href, COUNT(p.CatUrlId) FROM cat_urls cu
USE INDEX FOR JOIN (PRIMARY)
JOIN products p ON p.CatUrlId=cu.Id
WHERE sil_id=4601038
GROUP by cu.Id
och det kommer att producera denna exekveringsplan:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
---+-------------+-------+-------+---------------+---------+---------+------------------+------+-------------
1 | SIMPLE | cu | index | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where
1 | SIMPLE | p | ref | CatUrl | CatUrl | 4 | cbs-test-1.cu.Id | 1 | Using index
Ignorera värdena som rapporteras i kolumnen rows
; de är inte korrekta eftersom mina tabeller är tomma.
Lägg märke till Extra
kolumnen innehåller nu bara Using where
men notera också att join type
kolumnen ändrad från ref
(mycket bra) för att index
(full index scan, inte riktigt bra).
En bättre lösning är att lägga till ett index i kolumnen SIL_Id
. Jag vet, SIL_Id
är ett prefix för index SIL(SIL_Id, AsCatId)
och i teorin ett annat index på kolumnen SIL_Id
är helt värdelös. Men det verkar lösa problemet i det här fallet.
ALTER TABLE cat_urls
ADD INDEX (SIL_Id)
;
Använd det nu i frågan:
SELECT cu.Href, COUNT(p.CatUrlId) FROM cat_urls cu
USE INDEX FOR JOIN (SIL_Id)
JOIN products p ON p.CatUrlId=cu.Id
WHERE sil_id=4601038
GROUP by cu.Id
Frågeexekveringsplanen ser mycket bättre ut nu:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
---+-------------+-------+------+---------------+--------+---------+------------------+------+-------------
1 | SIMPLE | cu | ref | SIL_Id | SIL_Id | 4 | const | 1 | Using where
1 | SIMPLE | p | ref | CatUrl | CatUrl | 4 | cbs-test-1.cu.Id | 1 | Using index
Nackdelen är att vi har ett extra index som är (teoretiskt) värdelöst. Den upptar lagringsutrymme och den förbrukar processorcykler varje gång en rad läggs till, raderas eller har dess SIL_Id
fältet ändrat.