1,700
행의 현재 테이블에 대한 솔루션은 정상입니다.
행 수가 100,000
인 경우 DISTINCT
은 비효율적 일 수 있습니다.
이 솔루션은 name
에 인덱스를 사용 :
여기에 효율적으로 작업을 수행하는 방법을 보여줍니다 내 블로그에있는 문서입니다. 첫 번째 문자를 한 번만 선택하면 색인 키 위로 이동합니다.
첫째, 함수를 만들어야합니다 :
CREATE FUNCTION fn_get_next_code(initial INT) RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE _next VARCHAR(200);
DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;
SELECT ORD(SUBSTRING(name, 1, 1))
INTO _next
FROM t_names
WHERE name >= CHAR(initial + 1)
ORDER BY
name
LIMIT 1;
RETURN _next;
END
이 기능은 시작 문자 코드 주어진 테이블에서 주어진 옆의 첫 시작 문자를 반환합니다.
둘째, 쿼리에서이 기능을 사용
SELECT CHAR(@r) AS starting,
@r := fn_get_next_letter(@r) AS next
FROM (
SELECT @r := ORD(LEFT(MIN(name), 1))
) vars, mytable
WHERE @r IS NOT NULL
를 각각의 반복에서 세션 변수 @r
는 인덱스를 사용하여 다음 시작 문자를 건너 뜁니다.
이것은 매우 빠르지 만 수십만 개의 행이있는 경우에만 비용을 지불합니다.
그렇지 않으면 DISTINCT
을 사용하십시오.
테이블에 몇 개의 레코드가 있습니까?나는 최적화 된 버전을 게시하고 싶지만 성가신 여부를 모른다 : – Quassnoi
좋아, 어쨌든 그것을 게시 :) 아마 내일 내 블로그에 귀하의 질문에 게시물을 만들거야. – Quassnoi