私は150,000以上の行(成長)以上の数値を計算する必要がありますが、私のクエリはかなり遅いです。ここで私のクエリを改善するには?
はCREATE TABLE
です:
CREATE TABLE `device` (
`id` int(11) NOT NULL auto_increment,
`registration_id` varchar(255) NOT NULL,
`creation_date` datetime NOT NULL,
`latest_activity_date` datetime NOT NULL,
`status` varchar(255) NOT NULL,
`type` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `IDX_8484BF65454ADE21` (`latest_activity_date`,`status`,`type`)
) ENGINE=InnoDB AUTO_INCREMENT=160969 DEFAULT CHARSET=utf8;
CREATE TABLE `article` (
`id` int(11) NOT NULL auto_increment,
`summary` longtext NOT NULL,
`creation_date` datetime NOT NULL,
`published_date` datetime default NULL,
`updated_date` datetime default NULL,
PRIMARY KEY (`id`),
KEY `IDX_A5051EECA76ED395` (`user_id`),
KEY `IDX_A5051EEC7B00651C9E0806AB` (`published_date`)
) ENGINE=InnoDB AUTO_INCREMENT=20216 DEFAULT CHARSET=utf8;
私は彼らの最新の活動日の与えられた各デバイスの公表条の数を取得する必要があります。
だから私は実行します。
SELECT m.registration_id, COUNT(a.id)
FROM device m, article a
WHERE (
m.latest_activity_date < CURRENT_TIMESTAMP AND
a.published_date >= m.latest_activity_date AND
m.status = 'enabled' AND
a.published_date <= CURRENT_TIMESTAMP AND (
m.registration_id <> '' OR
m.registration_id IS NOT NULL
)
) AND m.type = 'foo'
GROUP BY m.registration_id
HAVING COUNT(a.id) > 0
しかし、このクエリは少し遅いですが
(約〜3000件の記事&〜150000のデバイスのための50秒かけて)私はEXPLAIN
しようとしたが、それはいずれかを与えるものではありません手がかり私はまた、任意のアイデアINNER JOIN
とLEFT JOIN ON a.published_date >= m.latest_activity_date
が、同じ結果の両方を使用して(参加。また、(しかし、それは「可能インデックス」としてIDX_8484BF65454ADE21を示して)すべての行が何のインデックスが使用されていない読まれていることを示している。
明示を試してみましたか?無に加えて
デバイステーブルと記事テーブルの間に相関列(JOIN)が表示されません... – DRapp
ええ、私はここに「暗黙の結合」を投稿しましたが、明示的な結合も試みました。同じ結果。 – Trent
私の現在の答えを膨らませないように...それはいくつかの "最後の活動"イベントを引き起こし続ける単一のデバイスですか?複数のデバイスがあり、それぞれに独自のアクティビティイベントが発生します。もしそうなら、どれくらいの距離をあなたがどんなデバイスの活動を許可したいのかがより良いかもしれません。 1月18日、Device BとDevice Aに関連したArticle Xをどうやって相互に関連付けるのでしょうか?各テーブルからいくつかのデータサンプルを投稿し、どのように相関させるべきか、あなたが期待するものを表示できますか?約10個のデバイスと20個の記事要素のダンプを行います。 – DRapp