Более быстрое сообщение, где источник 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 ответ

Это ужасный запрос. Это будет либо

  1. Сканирование всего
  2. Для каждого идентификатора ищите (случайным образом) идентификатор в индексе B.

или же

  1. Сканирование всех индекса B на UID
  2. Для каждого uid ищите (случайным образом) идентификатор в A (в PK, следовательно, я данные).

В любом случае,

  • все 30 ГБ A будут затронуты
  • большая часть индекса UID будет затронута
  • Шаг 1 будет линейным сканированием
  • Шаг 2 будет случайным зондированием, предположительно с большим количеством операций ввода-вывода.

Пожалуйста, объясните намерение, если запрос; может быть, мы можем помочь вам переформулировать его для достижения той же или аналогичной цели.

Между тем, сколько у вас оперативной памяти? Что такое настройка innodb_buffer_pool_size? И есть ли таблицы InnoDB?

Запрос в конечном итоге вернет результат, если какой-то "тайм-аут" не убьет его.

Является id AUTO_INCREMENT? Или uid "UUID"? (UUID ухудшают производительность, но есть несколько небольших советов, которые могут помочь.)

Другие вопросы по тегам