이상한 MySQL 성능 동작에 정말 놀랐습니다. 내 다음 쿼리를 실행하기 위해 약 3 시간 걸리는 :MySQL의 잘못된 OR 및 ISNULL 성능
UPDATE ips_invoice AS f SET ips_locality_id = (
SELECT ips_locality_id
FROM ips_user_unit_locality AS uul
JOIN ips_user AS u ON u.id = uul.ips_user_id
WHERE
(u.id = f.ips_user_id OR u.ips_user_id_holder = f.ips_user_id) AND
uul.date <= f.date
ORDER BY `date` DESC
LIMIT 1
)
WHERE f.ips_locality_id IS NULL;
내가 또한 다음을 시도했지만 얻을 동일한 성능 결과 :
가UPDATE ips_invoice AS f SET ips_locality_id = (
SELECT ips_locality_id
FROM ips_user_unit_locality AS uul
JOIN ips_user AS u ON u.id = uul.ips_user_id
WHERE
IFNULL(u.ips_user_id_holder, u.id) = f.ips_user_id
AND
uul.date <= f.date
ORDER BY `date` DESC
LIMIT 1
)
WHERE f.ips_locality_id IS NULL;
논리는 경우 : "ips_user_id_holder"열이없는 경우 null, 나는 그것을 사용해야한다, 그렇지 않으면 "id"컬럼을 사용해야한다. 나는 두 개의 쿼리로 쿼리를 분할하는 경우
, 각각의 실행 15 초 정도 걸릴 :
UPDATE ips_invoice AS f SET ips_locality_id = (
SELECT ips_locality_id
FROM ips_user_unit_locality AS uul
JOIN ips_user AS u ON u.id = uul.ips_user_id
WHERE
u.ips_user_id_holder = f.ips_user_id
AND
uul.date <= f.date
ORDER BY `date` DESC
LIMIT 1
)
WHERE f.ips_locality_id IS NULL;
UPDATE ips_invoice AS f SET ips_locality_id = (
SELECT ips_locality_id
FROM ips_user_unit_locality AS uul
JOIN ips_user AS u ON u.id = uul.ips_user_id
WHERE
u.id = f.ips_user_id
AND
uul.date <= f.date
ORDER BY `date` DESC
LIMIT 1
)
WHERE f.ips_locality_id IS NULL;
그렇지 내가 에 "OR"또는 "널 검사"MySQL의 문제에있어 처음으로 상대적으로 간단한 쿼리 (Why this mysql query (with is null check) is so slower than this other one?).
ips_invoice 테이블에는 약 400.000 개의 레코드가 있고, ips_user_unit_locality에는 약 100.000 개의 레코드가 있고 ips_user에는 약 35.000 개의 레코드가 있습니다.
저는 Ubuntu Amazon EC2 인스턴스에서 MySQL 5.5.49를 실행 중입니다.
그래서 첫 번째 및 두 번째 쿼리의 문제점은 무엇입니까? 중요한 성능 차이의 원인은 무엇입니까?
와우, 재미있는 대안. 정말 고마워! –