mysql이 다음 쿼리를 설명하도록 만들었습니다.
SELECT carid,pic0,bio,url,site,applet
FROM cronjob_reloaded
WHERE
carid LIKE '%bmw%'
OR
carid LIKE '%mer%'
OR
age BETWEEN '5' AND '10'
OR
category IN ('used')
ORDER BY CASE
WHEN carid LIKE '%bmw%' OR carid LIKE '%mer%' THEN 1
WHEN age BETWEEN '5' AND '10' THEN 2
ELSE 3
END
그리고 다음은 설명 결과입니다.
EXPLAIN SELECT carid, pic0, bio, url, site, applet
FROM cronjob_reloaded
WHERE carid LIKE '%bmw%'
OR carid LIKE '%mer%'
OR carid IS NOT NULL
AND age
BETWEEN '5'
AND '10'
내가 이해하지 못하는 것 :
키가 NULL 인 이유는 무엇입니까?
이 쿼리를 더 빠르게 만들 수 있습니까? 0.0035 초가 걸립니다. 1000 행 테이블의 경우 느리거나 빠릅니까?
내 테이블에서 carid는 테이블의 기본 키입니다.
해결 방법
MySQL이 쿼리에 사용할 인덱스를 찾지 못했습니다.
쿼리 속도는 CPU에 따라 다르며 행이 매우 적은 경우에도 사용 가능한 RAM, 시스템로드 및 디스크 속도에 따라 다릅니다. BENCHMARK
를 사용하여 쿼리를 여러 번 실행하고 더 높은 정밀도로 시간을 측정 할 수 있습니다 (예 : 100,000 번 실행하고 총 시간을 100,000으로 나눕니다).
색인 생성 문제 : WHERE
절에는 carid
, age
, category
(그리고 간접적으로 performerid
). 먼저 category
(직접 일치를 요청하기 때문에), age
, 마지막으로 carid
에 대해 색인을 생성해야합니다.
CREATE INDEX test_index ON cronjob_reloaded ( category, age, carid );
이는 MySQL이 단일 인덱스 작업에서 쿼리의 WHERE
단계에 필요한 대부분의 정보를 모아줍니다.
performerid
를 추가하면 여러 요인에 따라 속도가 빨라질 수도 있고 그렇지 않을 수도 있습니다. 나는없이 시작하고 나중에 그것을 테스트 할 것입니다.
업데이트 : 원래 검색어가 변경된 것 같으며 더 이상 performerid
가 표시되지 않습니다.
마지막으로 1000 개의 행은 일반적으로 시간이 거의 걸리지 않아 모든 것을로드하고 WHERE
가 자체적으로 정렬하도록하는 것이 더 빠르기 때문에 MySQL이 색인을 전혀 사용하지 않기로 결정할 수도 있습니다.
참조 페이지 https://stackoverflow.com/questions/12390373
'MySql' 카테고리의 다른 글
MySQL 삭제 순서 (0) | 2021.01.29 |
---|---|
MySQL mySQL에서 LINQ to SQL을 사용하는 방법 (0) | 2021.01.29 |
MySQL 다른 테이블 값을 기반으로하는 MySQL 업데이트 테이블 (0) | 2021.01.29 |
MySQL PHP 또는 MySQL을 사용하여 오전 / 오후 시간을 24 시간 형식으로 변환 하시겠습니까? (0) | 2021.01.29 |
MySQL 동일한 열 값을 가진 필드의 합계를 찾는 MySQL 쿼리 (0) | 2021.01.29 |
댓글