Det ser ud til, at af en eller anden grund MySQL
vælger at bruge indekset SIL
på den første tabel, og den bruger begge til opslag (WHERE sil_id = 4601038
) og gruppering (GROUP BY cu.Id
).
Du kan bede den bruge PK
af 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
og det vil producere denne udførelsesplan:
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
Ignorer værdierne rapporteret i kolonne rows
; de er ikke korrekte, fordi mine tabeller er tomme.
Bemærk Extra
kolonnen indeholder nu kun Using where
men bemærk også, at joinforbindelsen type
kolonne ændret fra ref
(meget god) til index
(fuld indeksscanning, ikke helt god).
En bedre løsning er at tilføje et indeks på kolonne SIL_Id
. Jeg ved det, SIL_Id
er et præfiks for indeks SIL(SIL_Id, AsCatId)
og i teorien et andet indeks på kolonne SIL_Id
er fuldstændig ubrugelig. Men det ser ud til, at det løser problemet i denne sag.
ALTER TABLE cat_urls
ADD INDEX (SIL_Id)
;
Brug det nu i forespørgslen:
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
Planen for udførelse af forespørgsler ser meget bedre ud 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
Ulempen er, at vi har et ekstra indeks, der (teoretisk) er ubrugeligt. Den optager lagerplads, og den bruger processorcyklusser, hver gang en række tilføjes, slettes eller har dens SIL_Id
felt ændret.