使用 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 会有所不同。
我的网站 - 一个在线商店。 我需要显示来自 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 会有所不同。