пожалуйста, у меня такая же проблема, как я нашел здесьMySQL Оптимизация ВЫБРАТЬ из 6 огромных идентичных таблиц с различными данными разделить на метку времени
MySQL - Selecting data from multiple tables all with same structure but different data,
я должен выбрать данные из нескольких таблиц MySQL с идентичную структуру, но разные данные (разбиваются на таблицы_0, table_1, table_2 и т. д. на таблицу_5, чтобы распределять миллионы записей данных).
Аппаратное обеспечение, создающее записи данных для каждого устройства, перемещается из таблицы в таблицу в соответствии с полем timestamp, которое НЕ является уникальным. например 50 записей в таблице_0 могут иметь одинаковую метку времени. Когда данные попадают в конец таблицы_5, он возвращается к таблице_0, чтобы начать переписывание данных там. Мне нужно получить данные на каждом устройстве за определенный промежуток времени.
столбцов данных Каждая таблица (для table_0, table_1 ... до table_5):
timestamp, robotGroupID, robotID, sensor1, sensor2, sensor3, ... (many of them)
Однако таблицы ОГРОМНЫ и UNION ALL (я прочитал его быстрее, чем DISTINCT) принимает навсегда для выполнения , даже с двумя таблицами, не говоря уже о 6. Например Я проиллюстрирую две таблицы ниже.
заявление MySQL в PHP: (показано только для датчика 1, датчик 2 и датчик 3)
(SELECT sensor1, sensor2, sensor3 FROM table_0 WHERE robotID=".$robotID." AND timestamp BETWEEN ".$timeStampStart." AND ".$timeStampStop)
UNION ALL
(SELECT sensor1, sensor2, sensor3 FROM table_1 WHERE robotID=".$robotID." AND timestamp BETWEEN ".$timeStampStart." AND ".$timeStampStop)
N.B он является точно такой же запрос для имени таблицы, за исключением. Данные датчиков для робота в пределах временного диапазона могут не охватывать ни один, один или несколько таблиц одновременно.
Я не могу использовать LIMIT, потому что количество отчетов от роботов в каждом временном диапазоне неизвестно заранее. Я не могу использовать MERGE STORAGE ENGINE, потому что у меня есть доступ только для чтения к базе данных компании.
У меня есть идея использовать count (robotID) или около того на каждой таблице, чтобы проверить перед запуском запросов, но я не уверен, как это сделать, потому что я довольно новичок.
Пожалуйста, как вы думаете, что я могу сделать эту работу быстрее для 6 таблиц и многих других столбцов, так как есть много столбцов, чем показано? Заранее спасибо!
- временная метка проиндексирована? вы могли бы предоставить EXPLAIN запроса, размещенного – ejrowley
Спасибо, ejrowley. Я не знал, что такое EXPLAIN, но я искал его и сделал то, что нашел там. Это то, что вам нужно? N.B. В таблицах нет первичных ключей. ------------------------------------------------- ------------------ стол: table_0 | Тип: диапазон | Возможные_блоки: IDX_TIME_UQ | key: IDX_TIME_UQ | key_len \t ref: 8 | строки: 488590 | Дополнительно: использование, где --------------------------------------------- ---------------------- стол: table_1 | Тип: диапазон | Возможные_блоки: IDX_TIME_UQ | key: IDX_TIME_UQ | key_len \t ref: 8 | строки: 675489 | Дополнительно: использование где – Cogicero
Сколько результатов вы ожидаете от запроса, это множество разных robotID или только несколько. Кроме того, как быстро, условно говоря, это запрос, когда он просто запускается на table_1. – ejrowley