优化Mysql查询(分组和排序依据->;使用索引;使用临时;使用文件排序)
以下是我的节目创建表tbl:优化Mysql查询(分组和排序依据->;使用索引;使用临时;使用文件排序),mysql,optimization,group-by,sql-order-by,Mysql,Optimization,Group By,Sql Order By,以下是我的节目创建表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 C
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 ;
因此,基本上,该表根据查询字符串跟踪站点中最常访问、查看和搜索的Simbol
我的问题是:
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)作为请求,而不是COUNT(*)作为请求代码>
中的1=1
和simbol not like=''
,这并没有证明有很大的区别李>
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;
任何帮助都将不胜感激,谢谢:)在运行时计算的字段中添加索引没有多大意义,它仍然需要在每次运行时进行排序/索引
索引on(request_time,simbol)可能允许优化程序更快地排除大量行,并减少键长度。在运行时计算的字段中添加索引没有多大意义,每次运行时仍需要对其进行排序/索引
索引打开(请求时间,simbol)可以让优化人员更快地排除大量行,并减少键长度。谢谢您的帮助。虽然它没有消除使用临时ori using filesort,但现在它比以前快了50%。我将尝试在将来实现一个最适合我需要的表结构。祝你度过一个美妙的一周。如果你需要使用这种性质的计数,最好将计数缓存在表中,这样你就可以对它进行索引,它会非常快。谢谢你的帮助。虽然它没有消除使用临时ori using filesort,但现在它比以前快了50%。我将尝试在将来实现一个最适合我需要的表结构。如果你需要使用这种性质的计数,最好将计数缓存在表中,这样你就可以对它进行索引,它会非常快。