Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法优化此查询?在MySQL中连接多行_Mysql - Fatal编程技术网

有没有办法优化此查询?在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);