テーブルにデータを入力しようとしています。クエリは、約 5,000 万レコードを含むテーブルで実行されています。私が現在使用しているクエリは以下のとおりです。template
ID に一致し、BETWEEN
2 つの UNIX タイムスタンプである行の数をカウントします。
SELECT COUNT(*) as count FROM `s_log`
WHERE `time_sent` BETWEEN '1346904000' AND '1346993271'
AND `template` = '1'
上記のクエリは機能しますが、それぞれをループしている間はパフォーマンスがかなり遅くtemplate
なり、数百になることもあります。タイムスタンプはint
適切にインデックス化されて保存されます。テストするために、time_sent
制限を省略して以下のクエリを実行してみました。
SELECT COUNT(*) as count FROM `s_log`
AND `template` = '1'
予想どおり、非常に高速に実行されますが、カウント結果が正しい時間枠内に制限されていないことは明らかです。2 つの UNIX タイムスタンプtemplate
をカウントする特定の AND 制限のカウントを取得するにはどうすればよいですか?BETWEEN
EXPLAIN:
1 | シンプル | s_log | 参照 | time_sent,テンプレート | テンプレート | 4 | 定数 | 71925 | where の使用
SHOW CREATE TABLE s_log:
CREATE TABLE `s_log` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`email` varchar(255) NOT NULL,
`time_sent` int(25) NOT NULL,
`template` int(55) NOT NULL,
`key` varchar(255) NOT NULL,
`node_id` int(55) NOT NULL,
`status` varchar(55) NOT NULL,
PRIMARY KEY (`id`),
KEY `email` (`email`),
KEY `time_sent` (`time_sent`),
KEY `template` (`template`),
KEY `node_id` (`node_id`),
KEY `key` (`key`),
KEY `status` (`status`),
KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM AUTO_INCREMENT=2078966 DEFAULT CHARSET=latin1