使用左连接的慢速mysql查询

使用左连接的慢速mysql查询,mysql,sql,join,left-join,explain,Mysql,Sql,Join,Left Join,Explain,我的网站-一个在线商店。 我需要显示类别表中的数据。 以及这类物品的数量 表中的行数项目约6700个 表中的行数类别123 我使用这个查询: SELECT c.* , COUNT( i.id ) count FROM category c LEFT JOIN items i ON i.catid = c.catid GROUP BY c.id 执行此查询的时间超过4秒 调查结果如下: 表格类别: CREATE TABLE IF NOT EXISTS `category ` (

我的网站-一个在线商店。 我需要显示类别表中的数据。 以及这类物品的数量

表中的行数项目约6700个

表中的行数类别123

我使用这个查询:

 SELECT c.* , COUNT( i.id ) count FROM category c  LEFT JOIN items i ON
 i.catid = c.catid  GROUP BY c.id
执行此查询的时间超过4秒

调查结果如下:

表格类别:

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.catidvarchar(16)与items.catidint(11) 如果比较int=int 推断catid只是数字,您可以尝试更改类别表中的catid列

alter table category modify column catid int(11) NOT NULL;
测试上面的代码

注意:如果您的category.catid大于2147483647,则必须 要更改为bigint而不是int

如果两个catid都不为空,我可以理解没有catid的iTen是不存在的,那么您可以通过在i.catid=c.catid上的内部连接项i来更改i.catid=c.catid上的左连接项i,我不确定这是否会更快,但请尝试一下


理想是catid是category和items的主键。catid是category.catid的外键。但要做到这一点,在可以添加外键items.catid之后,需要删除category.id的主键并添加到category.catid。但是只需比较int=int就会产生差异。

使用
Explain
命令运行查询,以帮助确定是否存在任何优化问题。在catid上放置索引。使catid成为两个表的INT,或至少相同type@James抢手货我通常先运行explain the命令,因为它非常容易使用,并且可以很快告诉您问题所在。我已经完成了它,但我不明白它的含义。解释:谢谢!修改为bigint。并将索引添加到
catid
。时间0.02秒。在此之前是33秒,项目中有20000行