Ищите JavaDoc в Eclipse

Это медленно, потому что оптимизатор MySQL генерирует неоптимальный план для оператора.

Мы можем использовать оператор MySQL EXPLAIN, чтобы увидеть детали плана выполнения.


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

То есть план выполнения MySQL мог бы получить строку для внешнего запроса, а затем проверить условие в предложении WHERE. Для этого MySQL может выполнять подзапрос, материализуя результаты этого во временную таблицу. Обратите внимание, что ключевое слово DISTINCT заставит MySQL выполнить уникальную сортировку, чтобы устранить дубликаты. Как только этот результат будет готов, MySQL может просмотреть результат, чтобы увидеть, найдено ли значение из внешней строки. В зависимости от версии оптимизатора MySQL индекс может отсутствовать. Если совпадение не найдено, строка из внешнего запроса отбрасывается.

Затем MySQL получает следующую строку из внешнего запроса и выполняет тот же процесс. Выполняется подзапрос, материализуется результат и сканируется, чтобы увидеть значение name.

Это, вероятно, худший вариант выполнения для больших наборов.

Или, может быть, подзапрос материализуется один раз, но индекса нет, поэтому каждая строка в подзапросе должна быть проверена на соответствие name для каждой строки из внешнего запроса. С помощью 24 000 строк, возвращаемых подзапросом, это потенциально 24 000 совпадений строк для каждой строки во внешнем запросе, который отбрасывается.

Другая возможность состоит в том, что MySQL ожидает получения блокировок, например таблицы являются MyISAM, и есть параллельные операции DML, удерживающие блокировки таблицы.


Хотим ли мы большего объяснения возможных причин низкой производительности, или мы просто должны перейти к некоторым альтернативным шаблонам запросов для повышения производительности?

Некоторые рекомендации для рассмотрения:

[1131 ]
  • операция объединения или EXISTS подзапрос, а не подзапрос IN
  • квалифицируют все ссылки на столбцы
  • не включают в себя посторонние символы

    • Демонстрация материализации результатов запроса в производную таблицу с операцией JOIN. Усовершенствования оптимизатора MySQL в более поздних версиях позволят автоматически создавать индекс для производной таблицы для повышения производительности. Но если производная таблица является движущей таблицей для объединения, MySQL может использовать индекс с name в качестве ведущего столбца. Например, индекс покрытия для запроса будет ... ON marketing.ads (name,tracking_key).

      SELECT t.name
           , t.tracking_key 
        FROM ( SELECT d.ad_name
                 FROM marketing.fbk_ad_stats_daily d
                WHERE d.date_start >= CURRENT_DATE() + INTERVAL -30 DAY
                  AND d.spend > 1
                GROUP
                   BY d.ad_name
             ) n
        JOIN marketing.ads t
          ON t.name = n.ad_name
      

      Иногда паттерн EXISTS дает подходящую производительность с соответствующими индексами. Обратите внимание, что подзапрос связан с внешней строкой, значение ad_name из подзапроса должно соответствовать значению name из внешнего запроса.

      SELECT t.name
           , t.tracking_key 
        FROM marketing.ads t
       WHERE EXISTS ( SELECT 1
                        FROM marketing.fbk_ad_stats_daily d
                       WHERE d.date_start >= CURRENT_DATE() + INTERVAL -30 DAY
                         AND d.spend      > 1
                         AND d.ad_name    = t.name    /*correlated to outer row*/
                    )
      

      Запрос этой формы потребует проверки каждой строки из t, поэтому подзапрос будет выполняться для каждой строки, проверенной (и не исключенной иным образом) внешний запрос.

    10
    задан Tobias 20 March 2013 в 16:33
    поделиться

    2 ответа

    Единственным путем я могу думать, должен использовать диалоговое окно Поиска Файла Eclipse для всех .java файлов и использовать это регулярное выражение в качестве входа:

    "(?s:/\*\*([^\*]|\*[^/])*?###INPUT###.*?\*/)"
    

    и замените ###INPUT### тем, что Вы ищете.

    Посмотрите этот другой вопрос об этом regex.

    5
    ответ дан 4 December 2019 в 03:39
    поделиться

    Если javadoc находится в исходных файлах, которые находятся в Вашей рабочей области затем, можно использовать 'Поиск Файла'.

    0
    ответ дан 4 December 2019 в 03:39
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: