[英]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_id
和merchant_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', 此外,您以不必要的方式使用單引號:
也許你需要在第一種情況下創建一些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.