【发布时间】:2020-10-15 09:01:11
【问题描述】:
我们在 mysql 数据库上查询时遇到性能缓慢的问题,我们不确定查询是否错误,或者 mysql 或服务器不够好。
带有子查询的查询返回一些项目详细信息(3 个字段)和最近拍摄的在线相机照片的文件名。
信息 表“项目”包含 40 条记录。 表“相机”包含大约 40 条记录(1 个项目,可能有多个相机) 表“cameraimages”包含大约 250000(250000)条记录。 (一台相机可以有数千张图像) 引擎是 InnoDb 数据库大小约为 100Mb 尚未添加任何索引。
版本号mysql 8.0.15
这是查询
SELECT
pj.title,
pj.description,
pj.city,
(SELECT cmi.filename
FROM cameras cm
LEFT JOIN cameraimages cmi ON cmi.cameraId = cm.id
WHERE cm.projectId = pj.id
ORDER BY cmi.dateRecording DESC
LIMIT 0,1) as latestfilename
FROM
projects pj
返回此数据需要 40-50 秒。 这对网页来说太长了,但我认为根本不需要那么长时间。 我们在另一台服务器上测试了相同的查询,以进行比较。相同的数据,相同的查询。 这需要 25 秒。
我的问题是:
- 此查询是否为“重/差”,如果是,哪个查询应该执行得更好?
- 有没有办法或者我应该检查什么来找出为什么这个查询在旧的/其他服务器上运行得更好?
希望有人能给点建议。 谢谢!
附加信息
CREATE TABLE `cameras` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`guid` varchar(50) DEFAULT NULL,
`title` varchar(50) DEFAULT NULL,
`longitude` double DEFAULT NULL,
`latitude` double DEFAULT NULL,
`status` smallint(6) DEFAULT NULL,
`cameraUid` varchar(20) DEFAULT NULL,
`cameraFriendlyName` varchar(50) DEFAULT NULL,
`projectId` int(11) DEFAULT NULL,
`dateCreated` datetime DEFAULT NULL,
`dateModified` datetime DEFAULT NULL,
`address` varchar(100) DEFAULT NULL,
`city` varchar(50) DEFAULT NULL,
`createArchive` smallint(6) DEFAULT '0',
`createDaily` smallint(6) DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=88 DEFAULT CHARSET=latin1
cameraId,dateRecording 列是唯一的。 一台相机同时拍摄照片。
【问题讨论】:
-
请添加您的MySql版本。
-
您可以在问题中包含
show create table cameras吗? -
(cameraId, dateRecording)是唯一的吗? -
请阅读此stackoverflow.com/tags/query-performance/info 和edit 您的问题以提供更多信息。
-
你能发布使用任何项目 ID 的单个子查询的解释吗? EXPLAIN SELECT cmi.filename .... 另外,您应该尝试将 LEFT JOIN 替换为 INNER JOIN,因为 LEFT JOIN 会阻止一些优化
标签: mysql performance subquery query-performance