0

説明プランに3分以上かかる場合は、時間を短縮する方法をお勧めします。 Select文とCount(*)はどちらも同じ時間がかかります。それ以下はクエリに時間がかかりすぎる(100kレコードで3分)

SELECT 
    s.sap_id AS 'SAP ID', 
    z.name AS 'Circle' , 
    m.mme_host_name AS 'MME HostName', 
    case when mmelog.retry_count is null then m.mme_status when mmelog.retry_count is not null then mmelog.status else null end AS 'Status', 
    case when mmelog.retry_count is null then m.description when mmelog.retry_count is not null then mmelog.reason else null end AS 'Description' , 
    m.modifiedTime AS Date, 
    ifnull(mmelog.retry_count,0)as 'Retry Count' 
FROM 
    site s 
INNER JOIN zone z ON s.zone_id = z.id 
INNER JOIN mme_result m ON m.site_id = s.id 
LEFT OUTER JOIN mme_connection_log mmelog ON mmelog.sap_id = s.sap_id 
WHERE 
    m.modifiedTime >= '2015-07-25' 
AND m.modifiedTime <= '2016-07-25' 
ORDER BY 
    m.modifiedTime, 
    s.sap_id; 

EXPLAIN PLAN:

----+-------------+--------+-------+--------------------------------------+---------------------+---------+----------------+-------+-----------------------------------------------------------------+ 
    | id | select_type | table | type | possible_keys      | key     | key_len | ref   | rows | Extra               | 
    +----+-------------+--------+-------+--------------------------------------+---------------------+---------+----------------+-------+-----------------------------------------------------------------+ 
    | 1 | SIMPLE  | z  | index | PRIMARY        | creator    | 5  | NULL   | 24 | Using index              | 
    | 1 | SIMPLE  | s  | ref | PRIMARY,site_region_fk    | site_region_fk  | 5  | siteforge.z.id | 1915 | NULL               | 
    | 1 | SIMPLE  | m  | ref | FK89FCE6D7459A62FF,modifiedTimeIndex | FK89FCE6D7459A62FF | 5  | siteforge.s.id |  2 | Using where              | 
    | 1 | SIMPLE  | mmelog | index | NULL         | idx_sapid_mmeconlog | 258  | NULL   | 16616 | Using where; Using index; Using join buffer (Block Nested Loop) | 
    +----+-------------+--------+-------+--------------------------------------+---------------------+---------+----------------+-------+--- 

| mme_connection_log |

CREATE TABLE `mme_connection_log` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `mme_host_name` varchar(255) DEFAULT NULL, 
    `modifiedTime` datetime DEFAULT NULL, 
    `reason` varchar(255) DEFAULT NULL, 
    `retry_count` int(11) DEFAULT NULL, 
    `sap_id` varchar(255) DEFAULT NULL, 
    `status` varchar(255) DEFAULT NULL, 
    `createdTime` datetime DEFAULT NULL, 
    `creator` int(10) unsigned DEFAULT NULL, 
    `last_modifier` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `sap_id` (`sap_id`,`mme_host_name`), 
    KEY `FKAD24771D82DD582F` (`creator`), 
    KEY `FKAD24771D43DE0263` (`last_modifier`), 
    KEY `mmehostINdex` (`mme_host_name`), 
    KEY `idx_sapid_mmeconlog` (`sap_id`), 
    CONSTRAINT `FKAD24771D43DE0263` FOREIGN KEY (`last_modifier`) REFERENCES `users` (`userid`), 
    CONSTRAINT `FKAD24771D82DD582F` FOREIGN KEY (`creator`) REFERENCES `users` (`userid`) 
) ENGINE=InnoDB AUTO_INCREMENT=55047 DEFAULT CHARSET=latin1 | 

| mme_result |

CREATE TABLE `mme_result` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `description` varchar(255) DEFAULT NULL, 
    `mme_host_name` varchar(255) DEFAULT NULL, 
    `mme_status` varchar(255) DEFAULT NULL, 
    `modifiedTime` datetime DEFAULT NULL, 
    `zone_id` int(10) unsigned DEFAULT NULL, 
    `site_id` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `mme_host_name` (`mme_host_name`,`site_id`), 
    KEY `FK89FCE6D7C1D1CCDF` (`zone_id`), 
    KEY `FK89FCE6D7459A62FF` (`site_id`), 
    KEY `mmehostINdex` (`mme_host_name`), 
    KEY `modifiedTimeIndex` (`modifiedTime`), 
    CONSTRAINT `FK89FCE6D7459A62FF` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `FK89FCE6D7C1D1CCDF` FOREIGN KEY (`zone_id`) REFERENCES `zone` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=914671 DEFAULT CHARSET=latin1 | 

SAPIDは、あなたがUNIQUE(a,b)を持っている場合、あなたはKEY(a)を必要としない

+0

説明whareを見つけるために説明する必要がありますインデックスが必要です。 – Jens

+0

ところで、 'Group by' senceなしで 'Count(*)'を作るのですか? – Jens

+1

コメントではなく質問に説明結果を追加してください – Jens

答えて

1

明瞭ではありません。これらの各テーブルには、このような冗長なインデックスが1つあります。

zoneをクエリから削除すると、正しい答えを得られますか? 「我々はゾーンエントリーを持っていなければならない」と言うだけのようです。

mは、INDEX(site_id, modifiedTime)(この順)のメリットがあります。

ほとんどの列はNULLです。 NULLに決して設定されないものは、NOT NULLと宣言する必要があります。

盲目的に言うと、varchar(255)、特にキーはありません。あなたがそれらを小さくすることができるかどうかを見てください(オーバーフローの危険を伴わない)。

LEFT JOINCOUNT(*)が奇妙に見えます。それはあなたが '正しい'テーブルの欠落している行を数えていることを意味します。 LEFTを正当化できますか?

他の2つのテーブルを表示できますか。さらなる提案があるかもしれません。

関連する問題