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

Pomalý výkon MYSQL pomocí řazení souborů

Problém je v tom, že MySQL používá při provádění dotazu pouze jeden index. Pokud přidáte nový index, který používá 3 pole ve vašem WHERE klauzule, najde řádky rychleji.

ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);

Podle dokumentace MySQL ORDER BY Optimization :

To je to, co se stane ve vašem případě. Jako výstup EXPLAIN nám říká, že optimalizátor používá klíč price najít řádky. Nicméně ORDER BY je v poli date_updated který nepatří ke klíči price .

Chcete-li rychleji najít řádky A řadit řádky rychleji, musíte přidat index, který obsahuje všechna pole použitá v WHERE a v ORDER BY klauzule:

ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);

Pole použité pro řazení musí být na poslední pozici v indexu. Je zbytečné uvádět price v indexu, protože podmínka použitá v dotazu vrátí rozsah hodnot.

Pokud EXPLAIN stále ukazuje, že používá řazení souborů, můžete zkusit donutit MySQL, aby použilo index, který si vyberete:

SELECT adverts.*
FROM adverts
FORCE INDEX(status_approved_date_updated)
WHERE price >= 0
AND adverts.status = 1
AND adverts.approved = 1
ORDER BY date_updated DESC 
LIMIT 19990, 10

Obvykle není nutné index vynucovat, protože správnou volbu nejčastěji provádí optimalizátor MySQL. Ale někdy je to špatná volba nebo ne nejlepší volba. Budete muset provést nějaké testy, abyste zjistili, zda to zlepšuje výkon nebo ne.



  1. Jak převést IPv6 z binárního kódu pro úložiště v MySQL

  2. Existují nějaká úskalí / věci, které potřebujete vědět při přechodu z MyISAM na InnoDB

  3. Proveďte regulární výraz (nahraďte) v dotazu SQL

  4. Rychlý způsob generování zřetězených řetězců v Oracle