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

MySQL ГДЕ НЕ В ЧРЕЗВЫЧАЙНО медленном

Ниже приведена инструкция SQL внутри хранимой процедуры (усечена для краткости):

SELECT * 
FROM item a 
WHERE a.orderId NOT IN (SELECT orderId FROM table_excluded_item);

Это заявление занимает 30 секунд или около того! Но если я удалю внутренний запрос SELECT, он упадет до 1 с. table_excluded_item невелик, но я подозреваю, что внутренний запрос выполняется чаще, чем нужно.

Есть ли более эффективный способ сделать это?


  • Внутренний запрос является зависимым подзапросом, что является печально известными узкими местами, поскольку подзапрос выполняется для каждой строки внешнего запроса. Ознакомьтесь с разделом Оптимизация подзапросов на сайте разработчиков MySQL. 05.01.2013

Ответы:


1

используйте 1_

SELECT  a.* 
FROM    item a 
        LEFT JOIN table_excluded_item b
            ON a.orderId = b.orderId
WHERE   b.orderId IS NULL

убедитесь, что orderId из обеих таблиц проиндексировано.

05.01.2013
  • Эй, это работает, спасибо! Теперь это до 2 с. Язык всегда кажется мне очень нелогичным :( 05.01.2013

  • 2

    Проблема с подходом левого соединения заключается в том, что при создании выходных данных могут обрабатываться повторяющиеся записи. Иногда это не так. . . в соответствии с этим статья, MySQL правильно оптимизирует left outer join, когда столбцы индексируются, даже при наличии дубликатов. Однако я признаю, что остаюсь скептичным, что такая оптимизация происходит всегда.

    У MySQL иногда возникают проблемы с оптимизацией операторов IN с подзапросом. Лучшее исправление — коррелированный подзапрос:

    SELECT * 
    FROM item a 
    WHERE not exists (select 1
                      from table_excluded_item tei
                      where tei.orderid = a.orderid
                      limit 1
                     )
    

    Если у вас есть индекс для table_excluded_item.orderid, то он будет сканировать индекс и остановится на первом значении (для этого может не быть строго необходимым limit 1). Это самый быстрый и безопасный способ реализовать то, что вы хотите в MySQL.

    05.01.2013
  • Технически limit 1 не требуется; анти-соединение в любом случае сделает то же самое. (может быть, что mysql недостаточно умен, чтобы знать это) 05.01.2013
  • Проблема с подходом левого соединения заключается в том, что вы можете получить повторяющиеся записи в выходных данных. -- Почему? помните, что вы ищете несуществующую запись. 06.01.2013
  • @ДжВ . . . Я перефразировал это. 06.01.2013

  • 3

    Попробуйте это и сравните со временем запроса LEFT JOIN:

    SELECT * 
    FROM item a 
    HAVING orderId NOT IN (SELECT orderId FROM table_excluded_item);
    

    Это не одобряется (использование HAVING, когда можно использовать WHERE), поскольку HAVING предполагает, что ограничивающее условие (orderId) является частью набора результатов. Но я думаю, что в этих сценариях это имеет больше смысла (поскольку это часть набора результатов) и потому что понятнее, что происходит, чем подход LEFT JOIN.

    На самом деле это может быть немного медленнее, но опубликуйте результаты, чтобы мы знали, лучше ли это, чем ваш исходный запрос.

    05.01.2013
  • ура - в моем наборе данных я постоянно получал ~ 7 с для этого против ~ 8 с для подхода левого соединения 12.12.2017
  • Новые материалы

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

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

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

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

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

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

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