簡體   English   中英

Mysql Query需要花費太多時間來執行

[英]Mysql Query takes too much time to execute

所以我需要表, products_used aprox 600MB和products_language_description ,大約5MB,但問題是這個查詢永遠不會運行...

我已經嘗試過REPAIR,OPTIMIZE ANALYZE,我沒有想法如何改進這個......

SELECT pu.products_id, count(pu.products_id) as products_count, p.products_name,
pu.time_used FROM products_used pu, products_language_description p
WHERE pu.merchant_id='69'
AND p.products_id=pu.products_id GROUP BY products_id ORDER BY products_count
DESC LIMIT 0, 20



CREATE TABLE `products_used` (
    `products_used_id` INT(15) NOT NULL AUTO_INCREMENT,
    `plans_key` VARCHAR(255) NOT NULL DEFAULT '0',
    `products_id` BIGINT(20) NOT NULL DEFAULT '0',
    `customers_id` INT(10) NOT NULL DEFAULT '0',
    `merchant_id` INT(10) NOT NULL DEFAULT '0',
    `time_used` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
    PRIMARY KEY (`products_used_id`),
    INDEX `plans_key` (`plans_key`)
)
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM
AUTO_INCREMENT=24625441;

CREATE TABLE `products_language_description` (
    `products_id` INT(5) NOT NULL DEFAULT '0',
    `products_description` LONGTEXT NOT NULL,
    `products_name` TEXT NOT NULL COLLATE 'utf8_general_ci',
    `products_help_info` LONGBLOB NOT NULL,
    `products_language` VARCHAR(255) NOT NULL DEFAULT '',
    PRIMARY KEY (`products_id`, `products_language`)
)
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM;

嘗試在products_used表的product_idmerchant_id字段中添加索引

對於此查詢:

SELECT pu.products_id, count(pu.products_id) as products_count,
       p.products_name, pu.time_used
FROM products_used pu join
     products_language_description p
     on p.products_id = pu.products_id
WHERE pu.merchant_id = '69'
GROUP BY pu.products_id
ORDER BY products_count DESC
LIMIT 0, 20

您需要有關products_used(merchant_id, products_id)的索引。 在MySQL中,有時您可以使用相關子查詢重寫聚合查詢以改善結果:

SELECT pu.products_id,
       (select count(*)
        from products_language_description p
        where p.products_id = pu.products_id
       ) as products_count,
       p.products_name, pu.time_used
FROM products_used pu
WHERE pu.merchant_id = '69'
ORDER BY products_count DESC
LIMIT 0, 20;

這將使用應該僅使用主鍵索引的相關查詢中的聚合替換外部group by

編輯:

等待。 你的問題是這兩個定義:

CREATE TABLE `products_used` (
    . . . 
    `products_id` BIGINT(20) NOT NULL DEFAULT '0',
)
   . . .
CREATE TABLE `products_language_description` (
    `products_id` INT(5) NOT NULL DEFAULT '0',
     . . . 
)

連接條件使用不同的數據類型。 修復表結構,使列具有相同的類型(使用alter table . . . )或重建它們。

看看你的WHERE部分。

WHERE pu.merchant_id ='69'AND p.products_id = pu.products_id GROUP BY products_id

您正在比較兩種不同的數據類型:

  • products_id INT(5) NOT NULL DEFAULT'0',
  • products_id BIGINT(20) NOT NULL DEFAULT'0',

此外,您以不必要的方式使用單引號:

  • pu.merchant_id ='69 '

也許你需要在第一種情況下創建一些indeces。 外鍵也有幫助!

也許這對你有幫助!

正如Gordon所提到的,我會將您的產品使用表的索引擴展為(merchant_id,product_id,time_used),因此它是覆蓋索引,而不必轉到原始數據來獲取您的計數()。 現在,對於給定商家,您將在products_used表中擁有SAME“products_id”的多個實例,這似乎很奇怪,但這是另一回事。

我會對您想要的商品進行產品ID,計數和時間的內部預先查詢。 否則,就像在Gordon的查詢示例中一樣,我首先將每個產品預先偽裝,然后在那個之外獲得商家的產品。

我建議預先查詢商家使用的內部產品,然后返回THAT后,獲取產品名稱。

SELECT 
      JustByMerchant.products_id, 
      JustByMerchant.products_count, 
      p.products_name,
      JustByMerchant.time_used 
   FROM
      ( select 
              pu.products_id, 
              count(*) as products_count, 
              pu.time_used 
           from
              products_used pu
           where
              pu.merchant_id = 69
           group by 
              pu.products_id
           order by
              COUNT(*) DESC
           limit 
              0, 20 ) JustByMerchant
        JOIN products_language_description p
           ON JustByMerchant.products_id = p.products_id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM