У меня есть две таблицы в той же базе данных, Device
и EventData
; обе таблицы имеют столбцы accountID
и deviceID
, которые также являются первичными ключами.Запрос MySQL с подзапросом для замедления
В таблице Device
есть столбец с именем linkDescription
.
Мне нужно дублировать некоторые строки в таблице EventData
, чья accountID
и deviceID
, в Device
таблицы, имея некоторый текст в колонке linkDescription
.
Пример:
стол Устройство
accountID DeviceID linkDescription
12345 5800 444
12345 5700 445
12345 5500 null <--literally null
12388 4400 555
12388 4450 555
EventData стол
accountID DeviceID timestamp
12345 5800 123335544
12345 5700 123335544
12345 5500 123335544
12388 4400 123335544
12388 4450 123335544
12345 5800 123335548
12345 5700 123335549
12345 5500 123335549
12388 4400 123335545
12388 4450 123335546
Теперь мне нужно дублировать некоторые строки на EventData
и изменить accountID
с помощью linkDescription
из Device
стол; так EventData
теперь имеет следующие данные:
accountID DeviceID timestamp
12345 5800 123335544
12345 5700 123335544
12345 5500 123335544
12388 4400 123335544
12388 4450 123335544
12345 5800 123335548
12345 5700 123335549
12345 5500 123335549
12388 4400 123335545
12388 4450 123335546
444 5800 123335544 <-duplicated data with new accountID from here
445 5700 123335544
555 4400 123335544
555 4450 123335544
444 5800 123335548
445 5700 123335549
555 4400 123335545
555 4450 123335546
Так что теперь я проверяю следующий запрос, который собирается быть частью более крупного INSERT INTO
:
explain
select *
from EventData
where
EventData.accountID in (
select accountID
from Device
where Device.linkDescription > '0')
and EventData.deviceID in (
select deviceID
from Device
where Device.linkDescription> '0')
and timestamp > (unix_timestamp(now()-interval 20 minute));
Но два медленно, и команду EXPLAIN
показать это:
ID select_type table type posible_keys key key_len ref rows Extra
1 PRIMARY EventData ALL null null null null 47555718 Using where
3 DEPENDENT SUBQUERY Device ALL null null null null 8043 Using where
2 DEPENDENT SUBQUERY Device index_subquery PRIMARY PRIMARY 34 func 3 Using where
Итак, насколько я понимаю, проверяет всю таблицу, и поэтому так медленно.
Как я могу сделать то, что хочу быстрее?
Попробуйте использовать 'JOIN's. – Kermit
'in' условия хорошо работают с детерминированными наборами (пример:' in (1, 2, 3, 5) ', но для подзапросов они могут быть катастрофическими, потому что подзапросы должны оцениваться один раз для каждой строки. для этого – Barranka
У меня есть модуль JAVA, который записывается в таблицу EventData, поэтому я думаю, что я собираюсь написать код, чтобы делать то, что хочу. У меня есть программы VB.NET и вы делаете похожие вещи, как вы говорите, делая запросы отдельно и создание нового запроса со всеми внутри IN, поэтому никакого подзапроса не требуется. –