sql >> Database teknologi >  >> RDS >> Mysql

Rette ved hjælp af hvor; Brug af midlertidig; Bruger filsortering

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.




  1. Lagring af mikrosekunder i MySQL:hvilken løsning?

  2. mysql-tjenesten starter ikke/lægger på - timeout (Ubuntu, MariaDB)

  3. ImportError:Intet modul med navnet 'MySQL'

  4. MySQL-transaktioner og samtidige indsættelser