簡體   English   中英

用LEFT-JOIN進行緩慢的MySQL查詢

[英]Slow mysql query with LEFT-JOIN

我的網站-在線商店。 我需要顯示類別表中的數據。 並計算該類別中的項目。

ITEMS中的行數約為6700

表中的行數CATEGORY 123

我使用以下查詢:

 SELECT c.* , COUNT( i.id ) count FROM category c  LEFT JOIN items i ON
 i.catid = c.catid  GROUP BY c.id

該查詢執行了4秒鍾以上

解釋的結果: http : //i.gyazo.com/c71c43af2719010cb5c4a2ad1d8cefd8.png

表格類別:

CREATE TABLE IF NOT EXISTS `category ` (   
`id` int(11) NOT NULL AUTO_INCREMENT,
`catid` varchar(16) NOT NULL,
`url` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`) 
 );

表項目:

CREATE TABLE IF NOT EXISTS ` items ` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`catid` int(11) NOT NULL,
`link` varchar(255) NOTNULL,
`title` varchar(255) NOT NULL, 
`images` text NOT NULL,  
`price` double NOT NULL, 
 `date` datetime NOT NULL, 
PRIMARY KEY (`id`) 
);

我該如何優化? 請幫忙

您正在比較category.catid varchar(16)與items.catid int(11),如果您比較int = int會更快,因為它推斷出catid只是數字,您可以嘗試更改類別表中的catid列

alter table category modify column catid int(11) NOT NULL;

在上面測試此代碼。

注意:如果您具有大於2147483647的 category.catid,則必須更改為bigint而不是int。

如果兩個catid 都不為null ,我可以理解沒有catid的話就沒有itens,那么您可以將IN JOINT 項i ON i.catid = c.catid更改為LE ON JOIN項i ON i.catid = c.catid我不請確定這樣做是否會更快,但是請嘗試一下。

理想的情況是catid是category和items的主鍵。catid是category.catid的外鍵。 但是,為此,您需要在添加外鍵item.catid之后,將主鍵移到category.id並添加到category.catid。 但是只比較int = int會有所不同。

暫無
暫無

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

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