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

优化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

以下是我的节目创建表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 ;
因此,基本上,该表根据查询字符串跟踪站点中最常访问、查看和搜索的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
因此,查询尝试获取最近一小时或今天访问最多的符号

为了避免使用临时文件和文件排序,我尝试了以下方法:

  • 添加一个ID作为主键,并使用
    COUNT(ID)作为请求,而不是
    COUNT(*)作为请求
  • 删除
    中的1=1
    simbol not like=''
    ,这并没有证明有很大的区别
  • 添加多个索引而不是reqular索引,以前每个列上都有索引ex(KEY(请求时间)、KEY(文件)、KEY(域)、KEY(simbol))
  • 我不太擅长优化,所以我已经没有选择了

    下面是我的“mysq\u slow\u query”文件的转储:

    查询时间:3锁定时间: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;
    

    任何帮助都将不胜感激,谢谢:)

    在运行时计算的字段中添加索引没有多大意义,它仍然需要在每次运行时进行排序/索引


    索引on(request_time,simbol)可能允许优化程序更快地排除大量行,并减少键长度。

    在运行时计算的字段中添加索引没有多大意义,每次运行时仍需要对其进行排序/索引


    索引打开(请求时间,simbol)可以让优化人员更快地排除大量行,并减少键长度。

    谢谢您的帮助。虽然它没有消除使用临时ori using filesort,但现在它比以前快了50%。我将尝试在将来实现一个最适合我需要的表结构。祝你度过一个美妙的一周。如果你需要使用这种性质的计数,最好将计数缓存在表中,这样你就可以对它进行索引,它会非常快。谢谢你的帮助。虽然它没有消除使用临时ori using filesort,但现在它比以前快了50%。我将尝试在将来实现一个最适合我需要的表结构。如果你需要使用这种性质的计数,最好将计数缓存在表中,这样你就可以对它进行索引,它会非常快。