sql >> Databasteknik >  >> RDS >> Mysql

Fixa Använda var; Använda tillfälliga; Använder filsortering

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.




  1. Skillnaden mellan UNIX_TIMESTAMP och NOW() i MySQL

  2. Senaste datetime från unika mysql index

  3. Hämtar länkad lista i MySQL-databas

  4. MySQL - Är det möjligt att få alla underobjekt i en hierarki?