Mysql
 sql >> база данни >  >> RDS >> Mysql

Производителността на MYSQL е бавна при използване на сортиране на файлове

Проблемът е, че MySQL използва само един индекс при изпълнение на заявката. Ако добавите нов индекс, който използва 3-те полета във вашия WHERE клауза, ще намери редовете по-бързо.

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

Съгласно документацията на MySQL ORDER BY Optimization :

Това се случва във вашия случай. Като изход на EXPLAIN ни казва, че оптимизаторът използва ключа price за да намерите редовете. Въпреки това, ORDER BY е в полето date_updated който не принадлежи на ключа price .

За да намерите редовете по-бързо И да сортирате редовете по-бързо, трябва да добавите индекс, който съдържа всички полета, използвани в WHERE и в ORDER BY клаузи:

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

Полето, използвано за сортиране, трябва да бъде на последната позиция в индекса. Безполезно е да включвате price в индекса, тъй като условието, използвано в заявката, ще върне диапазон от стойности.

Ако EXPLAIN все още показва, че използва сортиране на файлове, можете да опитате да принудите MySQL да използва индекс, който изберете:

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

Обикновено не е необходимо да се форсира индекс, тъй като MySQL оптимизаторът най-често прави правилния избор. Но понякога прави лош избор или не е най-добрият избор. Ще трябва да изпълните някои тестове, за да видите дали подобрява производителността или не.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка в синтаксиса на MySQL ПРИ АКТУАЛИЗИРАНЕ НА ДУБЛИРАН КЛЮЧ

  2. Транспониране на редове в заглавки в MYSQL

  3. Изключение за хибернация на MySQL Cross Join Query

  4. Как да получите достъп до обект RowDataPacket

  5. Най-близките места с географска ширина и дължина