【问题标题】:SELECT COUNT Index选择计数索引
【发布时间】:2014-09-25 23:00:50
【问题描述】:

我是 MySQL 数据库优化的新手。

我的查询很慢:

   SELECT COUNT(DISTINCT p.product_id) AS total 
     FROM shs_product p 
LEFT JOIN shs_product_description pd 
       ON (p.product_id = pd.product_id) 
LEFT JOIN shs_product_to_store p2s 
       ON (p.product_id = p2s.product_id) 
LEFT JOIN shs_product_to_category p2c 
       ON (p.product_id = p2c.product_id) 
    WHERE pd.language_id = '1' 
      AND p.status = '1' 
      AND p.date_available <= NOW() 
      AND p2s.store_id = '$

任何人都可以就创建索引以加快查询速度提出建议吗? 您会推荐哪个表和哪个列?

任何帮助将不胜感激...

【问题讨论】:

  • 只是补充一点:这个和其他查询导致高 CPU 使用率/负载。我也在努力处理 my.cnf 文件,但我失败了。如果有人能提出建议,我将不胜感激。
  • 您的查询没有按照您的想法执行。您的左联接实际上是内部联接。将表连接的条件移至所述 JOIN 的 ON 子句。
  • 不确定这是否会提高速度..但是您正在使用此查询措辞的方式将左连接减少为内连接...当找不到记录时左连接会产生空值(内部join 过滤掉它们)。 where p2s.store_ID = '$ 表示任何具有空值的记录(包含的记录,因为您离开加入)最终在这个 where 子句中被过滤掉(IE,这个查询也可能是所有内部连接)。并不是真正的速度帮助,只是想确保您意识到这一点。 p2c 的左连接似乎无关紧要。
  • 谢谢你,塞巴斯;如何将表连接上的条件移至 ON 子句?

标签: mysql sql select count


【解决方案1】:

三个观察:

  1. where 子句正在撤消与p2spd 的外连接。因此,您不妨将这些称为内部联接。
  2. p2c 表未被使用。因为您正在执行count(distinct),所以您可以删除它。
  3. 大概,ID 是整数,所以你不需要引号

所以,查询是等价的

SELECT COUNT(DISTINCT p.product_id) AS total 
FROM shs_product p JOIN
     shs_product_description pd 
     ON p.product_id = pd.product_id JOIN
     shs_product_to_store p2s 
     ON p.product_id = p2s.product_id 
 WHERE pd.language_id = 1 AND p.status = 1 AND p.date_available <= NOW() AND
       p2s.store_id = '$'

对于此查询,您需要shs_product(status, date_available) 上的索引。您还需要用于连接的列和where 子句中的索引。我建议:shs_product_description(product_id, language_id)shs_product_to_store(product_id, store_id)

最后,假设product_idproduct 中的唯一索引,您可以使用existscount(*) 代替count(distinct) 来表达这个查询:

select count(*)
from shs_product p
where p.status = 1 AND p.date_available <= NOW() and
      exists (select 1
              from shs_product_description pd
              where p.product_id = pd.product_id and pd.language_id = 1
             ) and
      exists (select 1
              from shs_product_to_store p2s 
              where p.product_id = p2s.product_id and p2s.store_id = '$'
             );

【讨论】:

  • 谢谢你,戈登。是的,我已经有了这些索引。我只需要更改查询。很好的建议。谢谢...
猜你喜欢
  • 2015-01-18
  • 1970-01-01
  • 2018-05-06
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2013-06-09
相关资源
最近更新 更多