有没有办法优化此查询?在MySQL中连接多行
我需要进行以下查询:有没有办法优化此查询?在MySQL中连接多行,mysql,Mysql,我需要进行以下查询: SELECT min(d.id) id, p.SERIAL serial, p.pos_id pos_id, MIN(fecha) fecha FROM pvs p JOIN devices d ON d.SERIAL=p.SERIAL GROUP BY p.SERIAL, p.pos_id ORDER BY p.pos_id ASC; 问题是“pvs”是一个非常长的表,有300多万行。这是一个我上传原始数据的表,但我尝试在工作数据库中获取这些元素的id(因此是min(d
SELECT min(d.id) id, p.SERIAL serial, p.pos_id pos_id, MIN(fecha) fecha
FROM pvs p
JOIN devices d
ON d.SERIAL=p.SERIAL
GROUP BY p.SERIAL, p.pos_id
ORDER BY p.pos_id ASC;
问题是“pvs”是一个非常长的表,有300多万行。这是一个我上传原始数据的表,但我尝试在工作数据库中获取这些元素的id(因此是min(d.id)部分)。这也是为什么我没有在pvs中的pos_id上添加外键的原因
结构如下:
CREATE TABLE pvs (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`pos_id` INT(11) NOT NULL,
`estado` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_ci',
`fecha` DATETIME NOT NULL,
`serial` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_ci',
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL
)
CREATE TABLE devices (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`serial` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
`rotulo` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
`code` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
`cost_center` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
`guia_recepcion` INT(11) NULL DEFAULT NULL,
`guia_reversa` INT(11) NULL DEFAULT NULL,
`pep` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
`modified_by` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
`modified_on` DATETIME NULL DEFAULT NULL,
`fecha_recepcion` DATETIME NULL DEFAULT NULL,
`fecha_instalacion` DATETIME NULL DEFAULT NULL,
`fecha_reversa` DATETIME NULL DEFAULT NULL,
`status_id` INT(10) UNSIGNED NOT NULL,
`location_id` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_ci',
`customer_id` INT(10) UNSIGNED NOT NULL,
`str_id` INT(10) UNSIGNED NOT NULL,
`model_id` INT(10) UNSIGNED NOT NULL,
`pos_id` INT(11) NOT NULL,
`user_id` INT(10) UNSIGNED NOT NULL,
`technician_id` INT(10) UNSIGNED NOT NULL,
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
`serial_prev` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
`reversa_prev` DATETIME NULL DEFAULT NULL
)
即使p.serial是varchar,我也应该将其作为外键吗?如果我只是使用p.pos_id作为连接子句,“id”是相同的。我用min()将其分组,因为我需要将其添加到select,而不需要将其添加到“groupby”。我需要查询相同的列
编辑:
确保您有适当的索引
create index idx1 on pvs( SERIAL);
及
d.serial
是唯一的吗?不,不是。它可以在多个ID中显示。那么p.serial
呢?它是独一无二的吗?不,它不是。该表跟踪某个位置的设备状态,实际上它们重复了很多次。那么这不是答案。为什么不能索引????索引可以是唯一的或非唯一的,在这种情况下,两个非唯一索引可以解决性能问题。索引可以是唯一的或唯一的或非唯一的。。。unioque只是一个索引的约束。正如你在mysql中看到的,doc unique是一个选项。@scaisEdge my bad,我认为索引必须是唯一的,谢谢。我还在创建索引。这要花很多时间。
create index idx2 on devices ( SERIAL);