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

Как да оптимизирам тази MySQL заявка? Милиони редове

Бих създал следните индекси (индекси на b-дърво):

analytics(user_id, source, id) 
transactions(analytics, status)

Това е различно от предложението на Гордън.

Редът на колоните в индекса е важен.

Филтрирате по конкретен analytics.user_id , така че това поле трябва да е първото в индекса. След това групирате по analytics.source . За да избегнете сортиране по source това трябва да е следващото поле на индекса. Позовавате се също на analytics.id , така че е по-добре това поле да е част от индекса, поставете го последно. Може ли MySQL да чете само индекса и да не докосва таблицата? Не знам, но е доста лесно за тестване.

Индекс на transactions трябва да започне с analytics , защото ще се използва в JOIN . Нуждаем се и от status .

SELECT 
    analytics.source AS referrer, 
    COUNT(analytics.id) AS frequency, 
    SUM(IF(transactions.status = 'COMPLETED', 1, 0)) AS sales
FROM analytics
LEFT JOIN transactions ON analytics.id = transactions.analytics
WHERE analytics.user_id = 52094 
GROUP BY analytics.source 
ORDER BY frequency DESC 
LIMIT 10 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Echo/return добавя празно пространство преди променлива

  2. Как да преминете през масив от входове във формуляр?

  3. Многостепенно меню, управлявано от база данни на PHP

  4. MySQL източник на данни не се появява във Visual Studio

  5. Условен MySQL ред по две (еднакво важни) колони