【问题标题】:Optimize Mysql Query (group and order by -> Using index; Using temporary; Using filesort)优化 Mysql 查询(分组排序 -> 使用索引;使用临时;使用文件排序)
【发布时间】: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

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

为了摆脱使用临时文件和文件排序,我尝试过这样做:

  1. 添加一个 ID 作为主键并使用 COUNT(id) AS requests 代替 COUNT(*) AS requests;
  2. 虽然删除了where 1=1simbol not like='',但这并没有太大区别;
  3. 添加多重索引而不是常规索引,以前每个列都有索引 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


    【解决方案1】:

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

    (request_time,simbol) 上的索引可以让优化器更快地排除大量行并减少键长度。

    【讨论】:

    • 感谢您的帮助。虽然它没有t eliminate the using temporary ori using filesort, now its 快 50%。将来我会尝试看看如何实现表结构以最适合我的需求。度过美好的一周。
    • 如果您需要使用这种性质的计数,最好将计数缓存在表中 - 这样您就可以对其进行索引,并且速度会非常快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2010-11-08
    • 2014-02-13
    • 2014-01-04
    • 2012-04-17
    相关资源
    最近更新 更多