MySQL自联接需要太长时间 - 我可以简化此查询吗?

时间:2012-07-03 19:26:32

标签: mysql performance self-join

我希望(并且非常肯定)有人在MySQL查询上比msyelf好得多。

我有一个查询,它检查包含以下信息的表: - 搜索词 - 使用此搜索字词的各个网站的标题和价格结果

为了简化,我已经将已经转换为小写的数据插入,并删除了空格,并将整个内容修剪为11个字符,以帮助减少MySQL服务器上的负载。

该查询旨在查找可能相同的标题的最高成本和最低成本,并确定价格差异(如果存在)。

在这里阅读了一些类似的问题之后,我还在查询中添加了EXPLAIN EXTENDED以查看是否有帮助,我将结果与查询一起包括在内。

查询原样:

SELECT
  a.pricesrch11,
  b.pricesrch11,
  a.pricegroup11,
  b.pricegroup11,
  a.priceamt - b.priceamt AS pricediff
FROM      ebssavings a
LEFT JOIN ebssavings b ON ( a.pricesrch11 = b.pricesrch11 ) 
                      AND (a.pricegroup11 = a.pricesrch11)
                      AND (b.pricegroup11 = a.pricesrch11)
WHERE a.priceamt - b.priceamt >0
GROUP BY a.pricesrch11

EXPLAIN的结果:

    select_type | table | type | possible_keys            | key  | key_len | ref  | rows | Extra
1 | SIMPLE      | a     | ALL  | pricesrch11,pricegroup11 | NULL | NULL    | NULL | 8816 | Using where; Using temporary; Using filesort
1 | SIMPLE      | b     | ALL  | pricesrch11,pricegroup11 | NULL | NULL    | NULL | 6612 | Using where

ADDENDUM:

我刚刚运行此查询并得到以下结果:

Showing rows 0 - 4 ( 5 total, Query took 66.8119 sec)


CREATE TABLE IF NOT EXISTS ebssavings 
( priceid int(44) NOT NULL auto_increment, 
  priceamt decimal(10,2) NOT NULL, 
  pricesrch11 varchar(11) character set utf8 collate utf8_unicode_ci NOT NULL, 
  pricegroup11 varchar(11) character set utf8 collate utf8_unicode_ci NOT NULL, 
  pricedate timestamp NOT NULL default CURRENT_TIMESTAMP, 
  PRIMARY KEY (priceid), 
  KEY priceamt (priceamt), 
  KEY pricesrch11 (pricesrch11), 
  KEY pricegroup11 (pricegroup11) ) 
ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8817 

更多关于新指数的信息(删除pricegroup11,并从pricerch11和pricegroup11制作了一个名为srchandtitle的综合指数):

Edit     Drop   PRIMARY BTREE   Yes No  priceid 169 A       
Edit     Drop   priceamt    BTREE   No  No  priceamt    56  A       
Edit     Drop   pricesrch11 BTREE   No  No  pricesrch11 12  A       
Edit     Drop   srchandtitle    BTREE   No  No  pricesrch11 12  A       
                                                pricegroup11 169    A   

3 个答案:

答案 0 :(得分:2)

创建两个索引:

  1. PriceSrch11
  2. pricerch11,pricegroup11
  3. 上的聚集索引

答案 1 :(得分:1)

删除pricegroup11上的Key并在pricesrch11,pricegroup11上添加复合群集密钥。

同时将表格移至InnoDB。

答案 2 :(得分:0)

现在看来,随着对表和索引的更改,事情已经加快了。

我已经把桌子倒空了,我又开始了。

谢谢大家的帮助。

-A