【问题标题】:how I can speed up mysql query with group by如何使用 group by 加速 mysql 查询
【发布时间】:2015-02-12 09:59:49
【问题描述】:

我有简单的 MyISAM 表进行搜索,我在其中为搜索文本索引了全文搜索离子“search_text”

表结构:

CREATE TABLE IF NOT EXISTS `product_search` (
  `dept_id` int(11) unsigned NOT NULL DEFAULT '0',
  `product_id` int(11) NOT NULL DEFAULT '0',
  `search_text` longtext,
  FULLTEXT KEY `search` (`search_text`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

查询:

SELECT p.product_id
      , p.dept_id
 FROM product_search p
 WHERE (MATCH(search_text) AGAINST('fathers day') AND 1 )
 GROUP BY product_id LIMIT 50

使用 group by 大约需要 10-12

没有分组需要 0.0086

当我用解释检查查询时 查询说明:

id  select_type   table      type       possible_keys    key    key_len     ref     rows    Extra   
1   SIMPLE        p  fulltext   search          search   0                   1      Using where; Using temporary; Using filesort

在这种情况下我该怎么办?

【问题讨论】:

  • 您的EXPLAIN 输出访问表v_cat_pro,而您的查询仅访问product_search(别名为p)。无论如何,您的EXPLAIN 输出表明 MySQL 认为它只需要检查单行——如果这需要 10-12 秒来执行,那么听起来有些东西已经严重损坏了。
  • 对不起,我忘记在解释中更改别名,现在我编辑了它..,我如何找到损坏的.. 因为它大约 2 gb 数据和 1 gb 全文索引

标签: mysql indexing group-by full-text-search


【解决方案1】:

您是否尝试过通过索引product_id 字段?

CREATE INDEX idx_product_id  ON product_search (product_id);

希望这将提高查询性能。谢谢。

【讨论】:

  • 嗨,我按照建议进行了索引,但没有在解释查询中使用 product_id 索引。请提出其他建议
  • 您好,请尝试使用 FORCE INDEX。喜欢,SELECT p.product_id, p.dept_id FROM product_search p FORCE INDEX FOR GROUP BY (idx_product_id) WHERE (MATCH(search_text) AGAINST('fathers day') AND 1 ) GROUP BY product_id LIMIT 50;
  • 但是我们无法比较具有 GROUP BY 和没有 GROUP BY 的查询。如果您使用 GROUP BY,则必须牺牲一些性能。
  • 是其他东西,我可以从中获得没有重复的 product_id 值,我将删除 group by , group by 只是为了避免结果集中的重复值
  • 嗯,您可以使用DISTINCT,但再次选择两个字段时,它将不起作用。但如果您只想选择 product_id,请使用它。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
相关资源
最近更新 更多