sql >> Databáze >  >> RDS >> Mysql

MySQL používá jiný index v závislosti na limitní hodnotě s dotazem ORDER BY

Tak to chodí. Vydržte se mnou chvilku...

Optimalizátor by chtěl použít INDEX, v tomto případě ACTI_DATE_I. Ale nechce to používat, pokud by to bylo pomalejší.

Plán A:Použijte index.

  1. Sáhněte do indexu strukturovaného BTree na konci (kvůli DESC)
  2. Skenovat dozadu
  3. Pro každý řádek v indexu vyhledejte odpovídající řádek v datech. Poznámka:Index má (ACTIVITY_DATE, ACTIVITY_ID), protože PRIMARY KEY je implicitně připojen k jakémukoli sekundárnímu klíči. Další vyhledávání v BTree, potenciálně náhodné, je dosáhnout „dat“ pomocí PK (ACTIVITY_ID). Proto je potenciálně pomalý. (Ve vašem případě ale ne příliš pomalu.)
  4. Toto skončí po LIMIT řádcích.

Plán B:Ignorujte tabulku

  1. Naskenujte tabulku a vytvořte tabulku tmp. (Pravděpodobně v paměti.)
  2. Seřaďte tabulku tmp
  3. Odloupněte LIMIT řádků.

Ve vašem případě (96 -- 1 % z 10 kB) je překvapivé, že si vybral skenování tabulky. Normálně je hranice někde kolem 10 % až 30 % počtu řádků v tabulce.

ANALYZE TABLE měl by způsobily přepočet statistik, což mohlo přesvědčili ho, aby šel s druhým plánem.

Jakou verzi MySQL používáte? (Ne, nevím o žádných změnách v této oblasti.)

Můžete zkusit jednu věc:OPTIMIZE TABLE ACTIVITIES; Tím se stůl znovu sestaví, čímž se bloky znovu zabalí a povede to k potenciálně různé statistiky. Pokud to pomůže, rád bych to věděl – protože normálně říkám „Optimalizovat tabulku je k ničemu“.




  1. Převod časového razítka pole datetime z mysql na php

  2. Zombie připojení k MySQL pomocí c3p0 s tomcat

  3. MySql:Spočítá, kolikrát se slova vyskytují ve sloupci

  4. Jak interpretujete plán vysvětlení dotazu?