2012-06-28 2 views
0

Есть ли способ оптимизировать этот запрос, время выполнения этого запроса составляет В этом запросе используется только две таблицы. один был Игрок подробнее таблица, содержащая данные игрока & другой был corn_player_data содержать скоринга записьОптимизация длинных запросов

SELECT 
    t.players_id, 
    t.players_name, 
    t.added_date, 
    t.total_death AS total_death, 
    t.total_king AS total_king, 
    GROUP_CONCAT(t.week_number) AS week_number, 
    GROUP_CONCAT(t.death) AS Death, 
    GROUP_CONCAT(t.King) AS King 
FROM (SELECT 
     p.id    AS players_id, 
     p.name   AS players_name, 
     cpd.added_date AS added_date, 
     cpd4.total_death AS total_death, 
     cpd5.total_king AS total_king, 
     WEEK(cpd.added_date) AS week_number, 
     GROUP_CONCAT(cpd.added_date) AS NewDate, 
     COUNT(cpd3.result) AS death, 
     COUNT(cpd2.result) AS King 
     FROM players AS p 
     LEFT JOIN cron_players_data AS cpd 
      ON cpd.player_id = p.id 
     LEFT JOIN cron_players_data cpd2 
      ON cpd2.player_id = p.id 
      AND cpd2.result = 1 
      AND cpd2.status = 1 
      AND cpd2.added_date = cpd.added_date 
     LEFT JOIN cron_players_data cpd3 
      ON cpd3.player_id = p.id 
      AND cpd3.result = 2 
      AND cpd3.status = 1 
      AND cpd3.added_date = cpd.added_date 
     LEFT JOIN (SELECT 
        cron_p_d.player_id, 
        COUNT(cron_p_d.result) AS total_death 
        FROM cron_players_data cron_p_d 
        WHERE cron_p_d.result = 2 
         AND cron_p_d.status = 1 
        GROUP BY (cron_p_d.player_id)) AS cpd4 
      ON cpd4.player_id = p.id 
     LEFT JOIN (SELECT 
        cro_p_d.player_id, 
        COUNT(cro_p_d.result) AS total_king 
        FROM cron_players_data cro_p_d 
        WHERE cro_p_d.result = 1 
         AND cro_p_d.status = 1 
        GROUP BY (cro_p_d.player_id)) AS cpd5 
      ON cpd5.player_id = p.id 
     GROUP BY (p.id),WEEK(cpd.added_date)) AS t 
GROUP BY t.players_id 

TABLE    CREATE TABLE            
----------------- --------------------------------------------------------- 
cron_players_data CREATE TABLE `cron_players_data` (      
        `id` INT(11) NOT NULL AUTO_INCREMENT,     
        `cat_id` BIGINT(30) DEFAULT '0',      
        `sub_cat_id` BIGINT(30) DEFAULT '0',     
        `team_id` BIGINT(30) DEFAULT '0',      
        `player_id` BIGINT(30) DEFAULT '0',      
        `status_team` VARCHAR(225) DEFAULT NULL,    
        `result` BIGINT(30) DEFAULT '0',      
        `home` BIGINT(30) UNSIGNED DEFAULT '0',     
        `guest` BIGINT(30) UNSIGNED DEFAULT '0',    
        `mvp` BIGINT(30) DEFAULT '0',       
        `oscar` BIGINT(30) DEFAULT '0',       
        `wam` BIGINT(30) DEFAULT '0',       
        `crown` BIGINT(30) DEFAULT '0',       
        `kiss` BIGINT(30) DEFAULT '0',       
        `slap` BIGINT(30) DEFAULT '0',       
        `bomb` BIGINT(30) DEFAULT '0',       
        `status` TINYINT(1) DEFAULT '0',      
        `added_date` DATE DEFAULT NULL,       
        PRIMARY KEY (`id`)          
        ) ENGINE=MYISAM AUTO_INCREMENT=265 DEFAULT CHARSET=utf8 

TABLE CREATE TABLE                    
------- ----------------------------------------- 
players CREATE TABLE `players` (                 
      `id` INT(11) NOT NULL AUTO_INCREMENT,             
      `cat_id` BIGINT(30) DEFAULT '0',               
      `sub_cat_id` BIGINT(30) DEFAULT '0',              
      `team_id` BIGINT(30) DEFAULT '0',              
      `name` VARCHAR(225) DEFAULT NULL,              
      `class_name` VARCHAR(225) DEFAULT NULL,             
      `image` VARCHAR(225) DEFAULT NULL,              
      `added_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
      PRIMARY KEY (`id`)                  
     ) ENGINE=MYISAM AUTO_INCREMENT=147 DEFAULT CHARSET=utf8 

выход будет как этот

players_id players_name added_date total_death total_king week_number Death King 
81 Mario Chalmers 2012-06-08 6 7 23,24,25,26 2,3,1,0 0,2,4,1 
82 Udonis Haslem 2012-06-09 2 7 23,24,25,26 0,1,0,1 1,1,4,1 
83 James Jones 2012-06-09 10 3 23,24,25,26 0,7,3,0 1,0,1,1 
84 Chris Bosch 2012-06-09 8 4 23,24,25,26 1,4,2,1 0,2,2,0 
85 Dwayne Wade 2012-06-09 6 4 23,24,25,26 1,3,1,1 0,2,2,0 
86 Eddie House 2012-06-09 5 4 23,24,25,26 0,3,2,0 1,1,1,1 
87 Joel Anthony 2012-06-09 6 6 23,24,25,26 1,3,1,1 1,2,3,0 
88 Mike Bibby 2012-06-08 5 9 23,24,25,26 0,3,1,1 2,3,4,0 
89 Mike Miller 2012-06-09 7 8 23,24,25,26 1,4,1,1 1,2,4,1 
90 Erick Dampier 2012-06-09 11 1 23,24,25,26 2,5,2,2 0,0,1,0 
91 Lebron James 2012-06-09 7 4 23,24,25,26 1,4,1,1 0,2,2,0 
92 Juwan Howard 2012-06-08 5 4 23,24,25,26 1,2,1,1 0,1,3,0 
+0

Добавление структур таблиц, вовлеченных индексов и т. Д. И даже сценарий для воссоздания и тестирования будет полезным. – Yaroslav

+0

Я добавляю структуру таблицы –

ответ

0

Вы используете MySQL или SQLServer? те, кто создает статусы, не работают на MSSQL. Я предполагаю, что вы используете mySQL, не очень много работали с этим, но этот пост может вам помочь.

MySql BigInt(20) vs Int(20) SQL Server BigInt or Int

В основном (но без тестирования) Я предполагаю, что значения BigInt не стоит, как вы действительно небольшие значения на этих колонках. Вы тратите много места, а также индексы, и все, что связано с этим, тоже много. Попробуйте переключиться на наименьший числовой тип, соответствующий вашим случаям (small int, tinyint?)

Смежные вопросы