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

MySQL Query bruger ikke indeks i tabel join

Som du kan se i EXPLAIN, er "book_id" angivet som en mulig nøgle. Hvis MySQL ikke bruger det, er det bare, at optimizeren ikke mener, at det ville fremskynde forespørgslen. Hvilket er sandt, hvis "book_sales" kun har 2 rækker, og 100% af disse rækker deler det samme "book_id". Det kaldes kardinalitet btw. Sådan undgår du tabelscanninger a> (MySQL-manual)

Prøv at udfylde den med flere rækker, og du skulle se, at MySQL vil bruge et indeks til joinforbindelsen.

Rediger:forespørgslen

SELECT sale_amount, price
FROM books, book_sales
FORCE INDEX ( book_id ) 
WHERE book_sales.book_id = books.book_id
AND books.author_id =1

...virker heller ikke i det tilfælde, fordi optimizeren stadig genkender, at læsning af indekset er suboptimal og skifter tabelrækkefølgen for at undgå at gøre det. Du kan gennemtvinge bordrækkefølgen ved at bruge STRAIGHT_JOIN . Dette er dog lidt af et hack, fordi det tvinger MySQL til at udføre forespørgslen på en måde, der ikke er den bedste.

      EXPLAIN
       SELECT sale_amount, price
         FROM books
STRAIGHT_JOIN book_sales FORCE INDEX (book_id) ON book_sales.book_id = books.book_id
        WHERE books.author_id = 1


  1. Konfiguration af lageropsætning [fil vs. database]

  2. i postgres, kan du indstille standardformateringen for et tidsstempel, efter session eller globalt?

  3. MYSQL, meget langsom rækkefølge

  4. Sådan sikkerhedskopieres MySQL-database i PHP?