有没有一种方法可以优化此查询?在MySQL中加入几行

时间:2019-03-27 14:40:21

标签: 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.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作为连接子句,则“ ids”是相同的。我将它与min()进行了分组,因为我需要将其添加到选择中而不将其添加到“ group by”中。我需要用于查询的相同列。

编辑:

The explain select

1 个答案:

答案 0 :(得分:1)

确保索引正确

    create index  idx1 on pvs( SERIAL); 

    create index  idx2 on devices ( SERIAL);