Оптимизация соединения на производной таблице - ОБЪЯСНЯЙТЕ разное на локальном и на сервере

Не будет никакой разницы в производительности. Используя java-cp, мы можем указать требуемые классы и jar в пути к классам для запуска файла класса java.

Если это исполняемый файл jar. Когда используется java -jar-команда, jvm находит класс, который должен запускаться из файла /META-INF/MANIFEST.MF внутри файла jar.

1
задан well actually 27 February 2019 в 00:10
поделиться

2 ответа

Так как именно здесь оптимизаторы сильно отличаются, давайте попробуем оптимизировать

SELECT APN, property_case_detail_id FROM property_inspection AS pi
  GROUP BY APN, property_case_detail_id
  HAVING 
  COUNT(IF(status='Resolved Date', 1, NULL)) = 0
) as open_cases

Попробуйте:

SELECT ...
    FROM property AS p
    WHERE NOT EXISTS ( SELECT 1 FROM property_inspection
                 WHERE status = 'Resolved Date'
                   AND p.parcel_number = APN )
    ORDER BY ???  -- without this, the `LIMIT` is unpredictable
    LIMIT 0, 1000;

или ...

SELECT ...
    FROM property AS p
    LEFT JOIN  property_inspection AS pi  ON p.parcel_number = pi.APN
    WHERE pi.status = 'Resolved Date'
      AND pi.APN IS NULL
    ORDER BY ???  -- without this, the `LIMIT` is unpredictable
    LIMIT 0, 1000;

Индекс:

property_inspection:  INDEX(status, parcel_number) -- in either order
0
ответ дан Rick James 27 February 2019 в 00:10
поделиться

MySQL 5.5 и 5.7 довольно сильно отличаются друг от друга, и последний имеет лучший оптимизатор, поэтому неудивительно, что планы объяснения отличаются.

Вам лучше предоставить выходные данные SHOW CREATE TABLE property; и SHOW CREATE TABLE property_inspection;, так как они будут показывать индексы, которые есть в ваших таблицах.

Ваш подзапрос является проблемой. - Сервер пытается обработать строки 1.6M без индекса и сгруппировать все. - Having довольно дорогая операция, поэтому вам лучше ее избегать, особенно в подзапросах. - Группировка в этом случае плохая идея. Вам не нужно агрегирование / подсчет. Вам нужно проверить, существует ли просто статус «Дата разрешения»

На основании предоставленной информации я бы порекомендовал: - Изменить таблицу property_inspection, чтобы уменьшить длину столбца status. - Добавить индекс по столбцу. Если возможно, используйте индекс покрытия (APN, property_case_detail_id, status) (в этом порядке столбцов). - Измените запрос на что-то вроде этого:

SELECT
    SQL_CALC_FOUND_ROWS
    DISTINCT p.parcel_number,
    ...
    p.id
FROM
    property_inspection AS `pi1`
    INNER JOIN property AS p ON (
        p.parcel_number = `pi1`.APN
    )
    LEFT JOIN (
        SELECT
              `pi2`.property_case_detail_id
            , `pi2`. APN
        FROM
            property_inspection AS `pi2`
        WHERE
            `status` = 'Resolved Date'
    ) AS exclude ON (
        exclude.APN = `pi1`.APN
        AND exclude.property_case_detail_id = `pi1`.property_case_detail_id
    )
WHERE
    exclude.APN IS NULL
LIMIT
    0, 1000;
0
ответ дан fifonik 27 February 2019 в 00:10
поделиться
Другие вопросы по тегам:

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