使用 LEFT-JOIN 的慢 mysql 查询

Slow mysql query with LEFT-JOIN

我的网站 - 一个在线商店。 我需要显示来自 table 个类别的数据。 以及该类别中的项目数。

tableITEMS 中的行数约 6700

table 类别 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

table 类别:

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`) 
 );

table 项:

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 只是数字,您可以尝试更改类别 table

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

测试上面这段代码。

NOTE: if you have any category.catid greater than 2147483647 you must to change to bigint instead of int.

如果两个 catid 都是 not null,我可以理解没有 catid 就没有 itens,那么你可以更改 LEFT JOIN items i ON i.catid = c.catid by INNER JOIN items i ON i.catid = c.catid 我不确定这是否会更快, 但试试看。

理想的情况是 catid 是类别的主键,items.catid 是 category.catid 的外键。但是要做到这一点,您需要删除 category.id 的主键并添加到 category.catid,然后才能添加外键 items.catid。但只是比较 int = int 会有所不同。