Более быстрое сообщение, где источник Mysql
У нас есть Mysql Master Slave архитектура. У нас около 1000 столов. 5 или 6 таблиц в нашей базе данных составляют от 30 до 40 ГБ каждая. Мы не можем объединить одну таблицу 30 ГБ с другой таблицей 30 ГБ, поскольку она никогда не возвращает результат.
Что мы делаем: Выберите необходимые данные из одной таблицы и затем найдите подходящие данные в другой таблице в виде фрагментов. Это дает нам результат, но это медленно.
После объединения двух таблиц в куски мы продолжаем обрабатывать эти таблицы. Мы используем еще несколько соединений, а также в зависимости от варианта использования.
Текущая БД: архитектура: 5 главных серверов, 100 подчиненных серверов.
1. Как мы можем сделать это быстрее? Индексация здесь не проблема, мы ее уже используем.
2. Нужен ли нам подход с большими данными, чтобы получить более быстрый результат?
РЕДАКТИРОВАТЬ: Детали запроса ниже
Query select count(*) from A, B where A.id = B.uid;
Таблица А 30 Гб, есть 51 столбец. Идентификатор - это первичный ключ, который является автоинкрементным целым числом.
Таблица B 27 ГБ, имеет 48 столбцов. uid (int 11) не является уникальным индексом.
MySql ISAM используется.
1 ответ
Это ужасный запрос. Это будет либо
- Сканирование всего
- Для каждого идентификатора ищите (случайным образом) идентификатор в индексе B.
или же
- Сканирование всех индекса B на UID
- Для каждого uid ищите (случайным образом) идентификатор в A (в PK, следовательно, я данные).
В любом случае,
- все 30 ГБ A будут затронуты
- большая часть индекса UID будет затронута
- Шаг 1 будет линейным сканированием
- Шаг 2 будет случайным зондированием, предположительно с большим количеством операций ввода-вывода.
Пожалуйста, объясните намерение, если запрос; может быть, мы можем помочь вам переформулировать его для достижения той же или аналогичной цели.
Между тем, сколько у вас оперативной памяти? Что такое настройка innodb_buffer_pool_size
? И есть ли таблицы InnoDB?
Запрос в конечном итоге вернет результат, если какой-то "тайм-аут" не убьет его.
Является id
AUTO_INCREMENT
? Или uid
"UUID"? (UUID ухудшают производительность, но есть несколько небольших советов, которые могут помочь.)