繁体   English   中英

优化Mysql查询(按->使用索引进行分组和排序;使用临时;使用文件排序)

[英]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

因此,查询尝试在最近一小时或今天获取最多访问的符号。

为了摆脱使用临时文件和使用文件排序,我尝试了以下操作:

  1. 添加一个ID作为主键,并使用COUNT(id) AS requests代替COUNT(*) AS requests;
  2. 删除where 1=1simbol not like='' ,虽然并simbol not like=''太大的不同。
  3. 添加多索引而不是必需索引,以前在每列ex上都有索引(KEY(request_time),KEY(文件),KEY(域),KEY(simbol))。

我在优化上不太好,所以我用光了所有的选项。

这是我的“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM