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

MySQL Query Optimization - вътрешни заявки

Винаги можете да използвате EXPLAIN или EXPLAIN EXTENDED за да видите какво прави MySql със заявка

Можете също така да напишете заявката си по малко по-различен начин, опитвали ли сте следното?

SELECT        s.*, 
              sm.url AS media_url 
FROM          shows AS s
INNER JOIN    show_medias AS sm ON s.id = SM.show_id
WHERE `s`.`id` IN ( 
                        SELECT DISTINCT st.show_id 
                        FROM show_time_schedules AS sts 
                        LEFT JOIN show_times AS st ON st.id = sts.show_time_id 
                        WHERE sts.schedule_date BETWEEN CAST('2012-01-10' AS date) AND CAST('2012-01-14' AS date) 
                        ) 
AND            `s`.`is_active` = 1 
AND            sm.is_primary = 1
ORDER BY       s.name asc 

Би било интересно да се види какъв е ефектът от това. Очаквам да е по-бързо, тъй като в момента мисля, че MySql ще изпълнява вътрешна заявка 1 за всяко шоу, което имате (така че една заявка ще се изпълнява много пъти. Обединяването трябва да е по-ефективно.)

Заменете INNER JOIN с LEFT JOIN, ако искате всички предавания, които нямат ред в show_medias.

РЕДАКТИРАНЕ:

Ще разгледам вашия EXPLAIN EXTENDED скоро, аз също се чудя дали искате да опитате следното; премахва всички подзаявки:

SELECT        DISTINCT s.*,  
                       sm.url AS media_url  
FROM                   shows AS s 
INNER JOIN             show_medias AS sm ON s.id = SM.show_id
INNER JOIN             show_times AS st ON (s.id = st.show_id)
RIGHT JOIN             show_time_schedules AS sts ON (st.id = sts.show_time_id)

WHERE                  `s`.`is_active` = 1  
AND                    sm.is_primary = 1 
AND                    sts.schedule_date BETWEEN CAST('2012-01-10' AS date) AND CAST('2012-01-14' AS date)  
ORDER BY               s.name asc 

(Също така би било добре да видите РАЗШИРЕНО ОБЯСНЕНИЕТО за тях - бихте могли да го добавите към коментарите за този).

Допълнителна РЕДАКТИРАНЕ:

На вашия EXPLAIN EXTENDED (добро начало за това как да четете тези е тук )

ИЗПОЛЗВАНЕ НА FILESORT и ИЗПОЛЗВАНЕ НА ВРЕМЕННО са и двата ключови индикатора. Надяваме се, че втората заявка, която препоръчвам, трябва да премахне всички ВРЕМЕННИ таблици (в подзаявката). Опитайте след това да оставите ORDER BY изключено, за да видите дали това прави разлика (и можем да добавим това към констатациите досега :-)

Виждам също, че заявката потенциално пропуска много търсения в индекс; всички ваши идентификационни колони са основни кандидати за съвпадения на индекси (с обичайния предупреждения за индекс ). Също така бих опитал да добавя тези индекси и след това да стартирам EXPLAIN EXTENDED отново, за да видя каква е разликата сега (РЕДАКТИРАНЕ, както вече знаем от коментара ви по-горе!)



  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 с PHP

  2. Сравняване на Percona XtraBackup с MySQL Enterprise Backup:Част първа

  3. mysql изтриване при присъединяване?

  4. Сигурен начин за съхранение на ключове за криптиране - PHP

  5. Получаване на съобщение SQLEXCEPTION в MySQL процедури