Есть ли способ оптимизировать этот запрос? ПРИСОЕДИНЯЙТЕСЬ к нескольким строкам в MySQL

0

Мне нужно сделать этот запрос:

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" - это очень длинная таблица с 3 миллионами строк. Это таблица, куда я загружаю необработанные данные, но затем пытаюсь получить идентификатор этих элементов в рабочей базе данных (отсюда и часть min (d.id)). это также причина, почему я не добавил внешний ключ как таковой на pos_id в pvs.

Структура следующая:

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 в качестве предложения объединения, "идентификаторы" одинаковы. Я сгруппировал его с помощью min(), потому что мне нужно было добавить его в выборку, не добавляя его в "group by". Мне нужны те же столбцы для запроса.

РЕДАКТИРОВАТЬ:

Изображение 174551

  • 0
    d.serial уникален?
  • 0
    Нет, это не так. Может отображаться в нескольких идентификаторах.
Показать ещё 2 комментария
Теги:

1 ответ

0

убедитесь, что у вас есть правильный индекс

    create index  idx1 on pvs( SERIAL); 

а также

    create index  idx2 on devices ( SERIAL); 
  • 0
    Тогда это не ответ.
  • 0
    почему нельзя индексировать ???? индексы могут быть уникальными или не уникальными, и в этом случае два не уникальных индекса могут решить проблему производительности.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню