Ve vašem prvním dotazu se ORDER BY provádí pomocí views_point
INDEX, protože byl použit v části WHERE dotazu a tudíž v MySQL lze použít k řazení.
Ve druhém dotazu MySQL řeší část WHERE pomocí jiného indexu, listing_pcs
. Toto nelze použít ke splnění podmínky OBJEDNÁVKA. MySQL místo toho používá řazení souborů, což je nejlepší volba, pokud nelze použít index.
MySQL používá indexy k řazení pouze v případě, že je index stejný jako index použitý v podmínce WHERE. Toto je příručka znamená:
Co tedy můžete udělat:
-
Zkuste zvětšit
sort_buffer_size
config, aby bylo třídění souborů co nejúčinnější. Velké výsledky, které jsou příliš velké pro třídicí vyrovnávací paměť, způsobují, že MySQL rozděluje řazení na kousky, což je pomalejší. -
Vynutit MySQL, aby zvolil jiný index. Stojí za zmínku, že různé verze MySQL volí výchozí indexy odlišně. Například verze 5.1 je dost špatná, protože Query Optimizer byl pro toto vydání značně přepsán a potřeboval spoustu vylepšení. Verze 5.6 je docela dobrá.
SELECT * FROM listings FORCE INDEX (views_point) WHERE (`publishedon_hourly` BETWEEN UNIX_TIMESTAMP( '2015-09-5 00:00:00' ) AND UNIX_TIMESTAMP( '2015-09-5 12:00:00' )) AND (published =1) AND cat_id IN ( 1, 2, 3, 4, 5 ) ORDER BY `views_point` DESC LIMIT 10