2015-07-02 46 views
-1

我遇到了mysql查詢的問題。mysql查詢中的速度問題

SELECT p.`id_product`, pl.`name`, p.`ean13`, p.`upc`, p.`active`, p.`reference`, m.`name` AS manufacturer_name, stock.`quantity`, product_shop.advanced_stock_management, p.`customizable` 
FROM `ps_product` p 
INNER JOIN ps_product_shop product_shop ON (product_shop.id_product = p.id_product AND product_shop.id_shop = 1) 
LEFT JOIN `ps_product_lang` `pl` ON p.`id_product` = pl.`id_product` AND pl.`id_lang` = 3 AND pl.id_shop = 1 
LEFT JOIN `ps_manufacturer` `m` ON m.`id_manufacturer` = p.`id_manufacturer` 
LEFT JOIN `ps_product_supplier` `sp` ON sp.`id_product` = p.`id_product` 
LEFT JOIN `ps_product_attribute` `pa` ON pa.`id_product` = p.`id_product` 
LEFT JOIN ps_product_attribute_shop product_attribute_shop ON (product_attribute_shop.id_product_attribute = pa.id_product_attribute AND product_attribute_shop.id_shop = 1) 
LEFT JOIN ps_stock_available stock ON (stock.id_product = p.id_product AND stock.id_product_attribute = IFNULL(`pa`.id_product_attribute, 0) AND stock.id_shop = 1 AND stock.id_shop_group = 0) 
WHERE (
    pl.`name` LIKE '%search_word%' 
    OR p.`ean13` LIKE '%search_word%' 
    OR p.`upc` LIKE '%search_word%' 
    OR p.`reference` LIKE '%search_word%' 
    OR p.`supplier_reference` LIKE '%search_word%' 
    OR `product_supplier_reference` LIKE '%search_word%' 
    OR pa.`reference` LIKE '%search_word%' 
    OR pa.`supplier_reference` LIKE '%search_word%' 
    OR pa.`ean13` LIKE '%search_word%' 
    OR pa.`upc` LIKE '%search_word%' 
) 
GROUP BY `id_product` 
ORDER BY pl.`name` ASC 

這是一個典型的Prestashop查詢,由Product :: searchByName()執行。 我有兩個數據庫,一個是當前數據庫,另一個是一個月前的備份。

備份數據庫比當前行數多,因爲有些產品已被刪除。備份數據庫的ps_product表中大約有8200行,當前數據庫中大約有6700行。

當我在備份數據庫中執行此查詢時,執行時間爲1秒,但是當我在當前DB中執行它時......執行時間超過300秒!!!

當前數據庫有什麼問題?執行時間應該更小!!我正在生氣呢!

+0

它們是否運行在相同的服務器硬件上?也許生產數據庫已經處於沉重負載之下? –

+0

是的,它們在同一臺機器上運行,即開發中的服務器。 –

+0

對查詢做一個EXPLAIN,看看它使用什麼索引執行 –

回答

0

問題在於某些表上已損壞的索引丟失。

1

請比較舊的(備份)和新數據庫的結構:

  1. 發動機類型(InnoDB和MyISAM數據),
  2. 指數(包括外鍵,如果發動機類型是InnoDB的) 。如果索引存在,請嘗試刪除它們並重新創建。