MySQL Отличается от подзапроса - PullRequest
0 голосов
/ 16 января 2020

MOVED TO: MySQL Отличная производительность

Basi c Идея:

1) У меня есть Mysql Сервер с большим количеством данных: 9 все таблицы связаны с внешними ключами более или менее линейным способом.

2) С помощью GUI я хочу получить некоторые результаты: показаны эти 9 таблиц и только одна переменная для каждой таблицы. Скажем:

  • Таблица 1: Частота: 20,40,80,100
  • Таблица 2: Длина волны: 300 400 500 600
  • Таблица 3: ....

Теперь, отметив в таблице-> Частота-> 20, база данных должна проверять каждую другую таблицу на наличие записей, которые измеряются с помощью Freq 20, и обновлять все таблицы в зависимости от 20.

НО : Я хочу показать только отдельные значения в каждой таблице. И это отличительное значение занимает 17 секунд, что очень мало для ожидания GUI.

Пример кода:

SELECT wafer.ID
FROM product
  JOIN chip ON chip.product_name=product.name
  JOIN wafer ON wafer.ID = chip.wafer_ID
  JOIN lot ON lot.ID = wafer.lot_ID
  JOIN ROI ON ROI.ID_string = chip.ROI_ID
  JOIN result ON result.chip_ID = chip.ID_string
  JOIN setup ON setup.ID_md5 = result.setup_ID 
  JOIN dataset ON dataset.ID_md5 = result.dataset_ID
WHERE product.name IN ("GoodProduct")

Продолжительность: 0.34 с выборка: 17 с (1.5e6 строк)

Объяснение:

id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra
1   SIMPLE  product     const   PRIMARY,name_UNIQUE PRIMARY 137 const   1   100.00  Using index
1   SIMPLE  dataset     index   PRIMARY,ID_UNIQUE   ID_UNIQUE   137     501 100.00  Using index
1   SIMPLE  result      ref dataset-result_idx,chip_ID_idx,setupID  dataset-result_idx  137 databaseName.dataset.ID_md5 159 100.00  
1   SIMPLE  setup       eq_ref  PRIMARY PRIMARY 137 databaseName.result.setup_ID    1   100.00  Using index
1   SIMPLE  chip        eq_ref  PRIMARY,ID_UNIQUE,Chip_UNIQUE,product_name_idx,ROI_ID   PRIMARY 452 databaseName.result.chip_ID 1   49.99   Using where
1   SIMPLE  ROI     eq_ref  PRIMARY,ID_UNIQUE   PRIMARY 302 databaseName.chip.ROI_ID    1   100.00  Using index
1   SIMPLE  wafer       eq_ref  PRIMARY,waferID_UNIQUE,number   PRIMARY 62  databaseName.chip.wafer_ID  1   100.00  
1   SIMPLE  lot     eq_ref  PRIMARY,lotnumber_UNIQUE    PRIMARY 62  databaseName.wafer.lot_ID   1   100.00  Using index

SELECT distinct wafer.ID {...same code as before}

Продолжительность: 23 с выборка: 0,000 с (54 строки)

Объяснение:

id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra
1   SIMPLE  product     const   PRIMARY,name_UNIQUE PRIMARY 137 const   1   100.00  Using index; Using temporary
1   SIMPLE  dataset     index   PRIMARY,ID_UNIQUE   ID_UNIQUE   137     501 100.00  Using index
1   SIMPLE  result      ref dataset-result_idx,chip_ID_idx,setupID  dataset-result_idx  137 databaseName.dataset.ID_md5 159 100.00  
1   SIMPLE  setup       eq_ref  PRIMARY PRIMARY 137 databaseName.result.setup_ID    1   100.00  Using index
1   SIMPLE  chip        eq_ref  PRIMARY,ID_UNIQUE,Chip_UNIQUE,product_name_idx,ROI_ID   PRIMARY 452 databaseName.result.chip_ID 1   49.99   Using where
1   SIMPLE  ROI     eq_ref  PRIMARY,ID_UNIQUE   PRIMARY 302 databaseName.chip.ROI_ID    1   100.00  Using index
1   SIMPLE  wafer       eq_ref  PRIMARY,waferID_UNIQUE,number   PRIMARY 62  databaseName.chip.wafer_ID  1   100.00  
1   SIMPLE  lot     eq_ref  PRIMARY,lotnumber_UNIQUE    PRIMARY 62  databaseName.wafer.lot_ID   1   100.00  Using index; Distinct

Мне действительно интересно, почему это отличное занимает так много времени. Все строки здесь имеют индексы. В этом примере показан код только для одной таблицы. Но мне нужно обновить 9 таблиц.

Есть ли способ ускорить этот процесс или этот "отдельный запрос"?

Кстати: я не совсем понимаю объяснения. Если бы был большой намек, я бы его не увидел ...

база данных

Ответы [ 2 ]

1 голос
/ 16 января 2020

Задавая вопрос о производительности запроса, вы должны показать структуры таблиц и индексы, чтобы вам было легче справиться.

Вы объединяете 8 таблиц вместе, и у вас есть единственное ограничение - продукт имя должно быть "GoodProduct". Таблица product объединяется с chip с product_name, поэтому вам следует проверить, есть ли у вас индексы для этих name / product_name -колонок. В зависимости от количества строк в ROI и result может потребоваться составной индекс для них.

Форматирование запроса немного сложное и трудно читаемое. Вы упрощаете вещи, используя формат:

SELECT wafer.ID
FROM product
  JOIN chip ON chip.product_name=product.name
  JOIN wafer ON wafer.ID = chip.wafer_ID
  JOIN lot ON lot.ID = wafer.lot_ID
  JOIN ROI ON ROI.ID_string = chip.ROI_ID
  JOIN result ON result.chip_ID = chip.ID_string
  JOIN setup ON setup.ID_md5 = result.setup_ID 
  JOIN dataset ON dataset.ID_md5 = result.dataset_ID
WHERE product.name IN ("GoodProduct")

Обратите внимание, что таблицы lot, ROI, result, setup и dataset присутствуют в запросе только по той причине, что необходимо быть строкой в ​​каждой таблице, которая соответствует "GoodProduct". Если это не является обязательным требованием, вы можете выполнить запрос только с таблицами product, chip и wafer, и производительность будет значительно выше.

0 голосов
/ 17 января 2020

Большинство этих таблиц ничего не доказывают в запросе. Удалите lot, dataset и, возможно, еще немного. OTOH, одна вещь, которую они могут предоставить, это, например, есть ли "лот" для товара. То есть это не даст вам желаемого ответа?

SELECT  DISTINCT wafer.ID
    FROM  product
    JOIN  chip  ON chip.product_name = product.name
    JOIN  wafer  ON wafer.ID = chip.wafer_ID
    WHERE  product.name IN ("GoodProduct")

Эти индексы могут помочь, если у вас их еще нет:

product:  (name)
result:  (dataset_ID, setup_ID, chip_ID)
dataset:  (ID_md5)
setup:  (ID_md5)
chip:  (ID_string, ROI_ID, wafer_ID, product_name)
ROI:  (ID_string)
wafer:  (lot_ID, ID)
...