![](/img/trans.png)
[英]MySql , JOIN and Group By query is Using temporary and Filesort
[英]Optimize Mysql Query (group and order by -> Using index; Using temporary; Using filesort)
这是我的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
因此,查询尝试在最近一小时或今天获取最多访问的符号。
为了摆脱使用临时文件和使用文件排序,我尝试了以下操作:
COUNT(id) AS requests
代替COUNT(*) AS requests;
where 1=1
和simbol not like=''
,虽然并simbol not like=''
太大的不同。 我在优化上不太好,所以我用光了所有的选项。
这是我的“ mysq_slow_query”文件的转储:
Query_time:3 Lock_time:0发送的行数:15已检查的行数: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;
任何帮助,将不胜感激,谢谢:)
在向运行时计算的字段添加索引的意义不大,仍然需要在每次运行时对其进行排序/索引。
(request_time,simbol)上的索引可以使优化器更快地排除很多行,还可以减少键的长度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.