Nano Hash - криптовалюты, майнинг, программирование

Как ускорить соединение таблиц mariadb

У меня есть 2 таблицы, из которых я присоединяюсь к определенным столбцам. Они объединены в столбце VARCHAR (индексированном в обеих таблицах). В таблице A чуть более 800 000 записей, а в таблице B — 20 000 записей. Таблица A имеет первичный ключ auto_inc. Таблица B не имеет первичного ключа, только индекс в упомянутом столбце VARCHAR.

Запрос занимает около 48 секунд, что слишком медленно. Что я могу сделать, чтобы увеличить скорость? Поможет ли создание первичного ключа auto_incr в таблице B? Даже если это не тот столбец, по которому происходит соединение?

Начинающий пользователь SQL. Обе таблицы InnoDB, и я использую Mariadb.

ЗАПРОС:

select distinct 
    `pr`.`ProductIdentifier` AS `ProductIdentifier`,
    `pr`.`Datum` AS `Datum`,
    `pr`.`Retailer` AS `Retailer`,
    `pr`.`Prijs` AS `Prijs`,
    `pm`.`Merk` AS `Merk`,
    `pm`.`Product` AS `Product`,
    `pm`.`Formaat` AS `Formaat` 
from 
   (`prices`.`prices_table` `pr` 
    join `prices`.`product_match_table` `pm` 
        on(`pr`.`ProductIdentifier` = `pm`.`ProductIdentifier`))

ОБЪЯСНИТЕ ВЫБРАТЬ:

Объяснить таблицу

20.11.2020

  • Как минимум, вам нужно показать SQL для запроса, который вы хотите ускорить. 21.11.2020
  • Укажите SHOW CREATE TABLE и EXPLAIN SELECT... 21.11.2020
  • Какой запрос? 21.11.2020
  • Я только что добавил его в исходный пост. 21.11.2020

Ответы:


1

Этот ответ основан на моих знаниях об индексации в целом; У MariaDB могут быть какие-то более специализированные опции, о которых я не знаю.

Однако в целом индексы ускоряют запросы двумя способами.

  • Имея только необходимые столбцы, что означает меньше данных для чтения и обработки
  • Путем сортировки соответствующим образом, чтобы помочь в обработке

Во-первых, вам обычно нужен индекс покрытия.

Для второго это включает

  • Сортируются так же (например, индексируются по тем же полям), что и таблицы, к которым они присоединяются в запросе.
  • Сортировка, чтобы предложения WHERE и другие типы фильтрации могли напрямую использовать сортировку для перехода к соответствующему месту в индексе/таблице.

На практике часто лучшим улучшением производительности является последнее, однако в вашем коде нет предложений WHERE. Если (как обычно) пользователи фильтруют результаты (например, показывают мне только результаты, где ProductName = 'Handbag'), вам может потребоваться настроить индексы для них (но об этом чуть позже).

Покрытие индексов для запроса выше

Я думаю, что с текущим запросом (и без фильтрации и т. д.) быстрее всего вы можете получить два индекса.

CREATE INDEX `IX_prices_ProductIdentifier` ON `prices`.`prices_table` 
    (`ProductIdentifier`,
    `Datum`,
    `Retailer`,
    `Prijs`);
CREATE INDEX `IX_productmatch_ProductIdentifier` ON `prices`.`product_match_table`
    (`ProductIdentifier`,
    `Merk`,
    `Product`,
    `Formaat`); 

Они обеспечивают покрывающие индексы для показанного запроса, и оба они отсортированы одинаково (по productIdentifier), чтобы упростить соединение.

Поиск/фильтрация (не указано в исходном примере)

Однако, если люди часто сначала выполняют поиск по определенному полю, то имеет смысл изменить порядок полей в соответствующей таблице (чтобы искомое поле было первым) или иметь несколько индексов с полем поиска впереди.

Например, люди могут искать определенные значения в pr.Retailer, pm.Merk или pm.Product. Поэтому вы можете добавить эти дополнительные индексы

CREATE INDEX `IX_prices_Retailer` ON `prices`.`prices_table` 
    (`Retailer`,
    `ProductIdentifier`,
    `Datum`,
    `Prijs`);
CREATE INDEX `IX_productmatch_Merk` ON `prices`.`product_match_table`
    (`Merk`,
    `ProductIdentifier`, 
    `Product`,
    `Formaat`); 
CREATE INDEX `IX_productmatch_Product` ON `prices`.`product_match_table`
    (`Product`,
    `ProductIdentifier`, 
    `Merk`,
    `Formaat`); 

Обратите внимание на то, что порядок полей имеет значение. Данные (индекс) сортируются по первому полю, затем по второму полю, затем по третьему полю и т. д. Чтобы эффективно использовать индекс, ваше предложение filtering/WHERE должно включать как минимум первое поле, если не больше.

В качестве альтернативы этим индексам (для фильтрации) можно использовать исходные два индекса, как указано выше, но затем поместить отдельный индекс в каждое из полей, по которым они могут выполнять поиск, например, если пользователи могут фильтровать по розничному продавцу, мерку и продукту. , затем создайте

  • один индекс на pr.Retailer
  • один на pm.Merk и
  • один на pm.Product

Предупреждения

Добавление индексов делает вставку данных в соответствующую таблицу (и часто удаление/обновление) медленнее, чем если бы индексов не было. Причина в том, что нужно не только обновить данные в таблице, но и обновить индекс(ы).

Обычно это не представляет большой проблемы, если только вы не часто добавляете и удаляете большое количество данных из таблиц. Но стоит проверить интерфейс «обслуживания продукта» (например, добавление продуктов, обновление цен и т. д.) после добавления индексов, чтобы убедиться, что они по-прежнему работают нормально.

21.11.2020
  • Спасибо что нашли время ответить. Я попробовал ваше предложение с покрывающими индексами. Это экономит около 10 секунд, но затем все равно занимает 38 секунд, что все еще кажется мне долгим. Я думаю, что основное время тратится на сопоставление столбцов, а не на чтение столбцов за соответствующим столбцом. В таблице цен почти 900 000 (и их количество увеличивается на тысячи каждый день) и 14 000 в таблице product_match. Есть ли способ улучшить эту часть запроса? Соответствующий столбец представляет собой VARCHAR длиной 125 символов. Я где-то читал, что может помочь индекс HASH? 22.11.2020
  • Когда пользователи используют этот отчет, сколько строк они получают? Получают ли они 900 000 строк при каждом запуске? Или они фильтруют по определенным столбцам? Если да, то по каким столбцам они фильтруют? 23.11.2020
  • Отчет не используется напрямую. Представление считывается студией данных Google (которая уже делает фильтр по «мерку» в разных отчетах). 23.11.2020
  • Если это так, я предлагаю добавить индекс «merk». Если это очень помогает, рассмотрите индекс с именем IX_productmatch_Merk в приведенном выше ответе (в качестве замены индекса только для мерка). 23.11.2020
  • Но что не помогает ускорить просмотр правильно? Проблема не в фильтрации в студии данных Google в качестве конечного пользователя. В студии данных уже есть отфильтрованная таблица, и она отлично работает. Я просто думаю, что мог бы улучшить представление для будущего масштабирования (поскольку база данных будет расти быстрыми темпами). 23.11.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..