Не будет никакой разницы в производительности. Используя java-cp, мы можем указать требуемые классы и jar в пути к классам для запуска файла класса java.
Если это исполняемый файл jar. Когда используется java -jar-команда, jvm находит класс, который должен запускаться из файла /META-INF/MANIFEST.MF внутри файла jar.
Так как именно здесь оптимизаторы сильно отличаются, давайте попробуем оптимизировать
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
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;