[英]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.