【发布时间】:2012-08-31 23:36:29
【问题描述】:
我正在尝试为表格填充一些数据。该查询正在包含约 5000 万条记录的表上运行。我目前使用的查询如下。它计算匹配template id 并且是BETWEEN 两个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'
正如预期的那样,它运行得非常快,但显然没有将计数结果限制在正确的时间范围内。如何获得特定 template 的计数并限制该计数 BETWEEN 两个 unix 时间戳?
EXPLAIN:
1 |简单 | s_log |参考 | time_sent,模板 |模板 | 4 |常量 | 71925 |在哪里使用
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
【问题讨论】:
-
template是否也被编入索引?您是否还考虑过在两列上都使用复合索引? -
请您在慢查询前添加
EXPLAIN -
@john: 也添加
show create table -
为什么要用撇号下的整数值编写查询(以字符串形式提交)?
标签: mysql performance