【问题标题】:Mysql multi group and order is very slow [closed]Mysql多组和订单很慢[关闭]
【发布时间】:2019-01-13 04:28:16
【问题描述】:

我正在尝试优化用于电子商务的 mysql 查询 - 自定义商店,该查询有一些内部连接和分组依据,这使得查询非常慢,我们正在使用它来生成类别的动态过滤器/组合、供应商、颜色等。

有人知道如何优化它吗? 一方面,我无法使 products(p) 表使用多索引而不是主键,查询大约需要 150-200 毫秒。

确切的查询:

SELECT DISTINCT(sl.id_supplier), 
       count(DISTINCT p.id_product) as product_count, 
       sl.supplier_name, 
       sl.supplier_slug, 
       sl.supplier_link 
FROM supplier s 
INNER JOIN supplier_lang sl 
  on s.id_supplier = sl.id_supplier 
  AND sl.id_project = 6 
  AND sl.id_lang =2 
  AND s.id_project = 6 
  AND s.active = 1 
INNER JOIN product p 
  ON p.id_project = 6 
  and p.active = 1 
  AND p.id_supplier = sl.id_supplier 
INNER JOIN product_category pc 
  on pc.id_project = 6 
  and pc.id_category = 6 
  and p.id_product = pc.id_product  
GROUP by sl.id_supplier 
ORDER BY sl.supplier_name ASC

谢谢

https://snag.gy/F6dy4r.jpg

【问题讨论】:

  • 请注意,DISTINCT 不是函数。此外,假设您永远不会将它与聚合函数一起使用是相当安全的,除非您第二次使用。
  • 您通常按您选择的列进行分组,除了那些作为设置函数的参数的列。
  • 另外,奇怪的是所有 id_projects 都应该是 6,而您却选择不将数据与该事实联系起来。

标签: mysql sql inner-join


【解决方案1】:

虽然上面有一个隐式的函数依赖,但我认为这样的查询看起来更像这样是一种很好的做法(并且通常会期望):

SELECT sl.id_supplier
     , sl.supplier_name
     , sl.supplier_slug
     , sl.supplier_link 
     , COUNT(DISTINCT p.id_product) product_count 
  FROM supplier s 

  JOIN supplier_lang sl 
    ON sl.id_supplier = s.id_supplier 
   AND sl.id_project = s.id_project 
   AND sl.id_lang = 2 

  JOIN product p  
    ON p.id_supplier = sl.id_supplier 
   AND p.id_project = s.id_project  
   AND p.active = 1 

  JOIN product_category pc 
    ON pc.id_product = p.id_product 
   AND pc.id_project = p.id_project 
   AND pc.id_category = 6 

 WHERE s.id_project = 6 
   AND s.active = 1 

 GROUP 
    BY sl.id_supplier 
     , sl.supplier_name
     , sl.supplier_slug
     , sl.supplier_link 
 ORDER 
    BY sl.supplier_name ASC

为了帮助优化这个查询,我们需要查看所有相关表的 SHOW CREATE TABLE 语句以及上述的 EXPLAIN。这将是对您的问题进行编辑的形式,并且不会包含任何图片。

【讨论】:

  • 谢谢你的回答,我会试试这个版本,看看它是否更快,还有一个表格打印屏幕和原帖中的解释链接:snag.gy/F6dy4r.jpg
  • @PepeleaRazvanIonut 它不会更快。不幸的是,我不做文字图片。此外,如果没有可用的索引,EXPLAIN 是毫无意义的。
  • 我放一张图片的原因是它旁边,它的整个数据库结构和索引,我认为这是任何人都可以帮助和理解的最简单的方法。
  • 你这么想也没关系。但你错了。我们喜欢的是文字。
猜你喜欢
  • 2014-04-19
  • 1970-01-01
  • 2015-03-28
  • 2012-02-09
  • 2014-01-11
  • 1970-01-01
  • 2011-03-13
  • 2018-06-12
  • 2012-08-31
相关资源
最近更新 更多