【发布时间】:2010-11-01 18:33:53
【问题描述】:
这是我的 SHOW CREATE TABLE tbl:
CREATE TABLE IF NOT EXISTS `msc_pagestats` (
`id` int(10) unsigned NOT NULL auto_increment,
`domain` varchar(250) NOT NULL,
`file` varchar(200) NOT NULL,
`simbol` varchar(100) NOT NULL,
`request_time` timestamp NULL default CURRENT_TIMESTAMP,
`querystring` mediumtext NOT NULL,
`host` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
KEY `myindex` (`simbol`,`request_time`,`file`,`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=248008 ;
因此,基本上,此表会根据查询字符串跟踪站点内访问次数最多、查看次数最多、搜索次数最多的符号。
我的查询是:
SELECT `simbol`, count(*) AS requests
FROM msc_pagestats
WHERE 1=1 AND request_time > '20100504000000'
AND simbol NOT LIKE ''
GROUP BY `simbol`
ORDER BY requests DESC
LIMIT 0, 15;
这个查询解释:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE msc_pagestats index NULL myindex 561 NULL 24961 Using where; Using index; Using temporary; Using filesort
因此,查询尝试获取最近一小时或今天访问次数最多的符号。
为了摆脱使用临时文件和文件排序,我尝试过这样做:
- 添加一个 ID 作为主键并使用
COUNT(id) AS requests代替COUNT(*) AS requests; - 虽然删除了
where 1=1和simbol not like='',但这并没有太大区别; - 添加多重索引而不是常规索引,以前每个列都有索引 ex (KEY(request_time), KEY(file), KEY(domain), KEY(simbol))。
我在优化方面不是那么好,所以我已经没有办法了。
这是我的“mysq_slow_query”文件的转储:
Query_time: 3 Lock_time: 0 Rows_sent: 15 Rows_examined: 220297
use kmarket;
SELECT `simbol`, count(*) AS requests
FROM msc_pagestats
WHERE 1=1 AND request_time > '20100504000000'
AND simbol NOT LIKE ''
GROUP BY `simbol`
ORDER BY requests DESC
LIMIT 0, 15;
任何帮助将不胜感激,谢谢:)
【问题讨论】:
标签: mysql optimization group-by sql-order-by