내가 읽은 여기 와 거기에 사용하여 해당 utf8_unicode_ci
데이터 정렬하는 유니 코드 문자의 더 나은 대우를 보장 기본에 비해 (예를 들어, 검색 및 주문에 대한 ‘OE’에 같은 문자 ‘œ’을 확장하는 방법을 과학적 이해) utf8_general_ci
기본적으로 그냥 분음 부호를 제거합니다. 불행히도 두 소스는 모두 utf8_unicode_ci
보다 약간 느립니다 utf8_general_ci
.
제 질문은 “약간 느리다”는 무엇을 의미합니까? 누구든지 벤치 마크를 실행 했습니까? -0.01 %의 성능 영향 또는 -25 %와 비슷한 것에 대해 이야기하고 있습니까?
당신의 도움을 주셔서 감사합니다.
답변
인터넷에서 벤치 마크를 찾지 못해서 벤치 마크를 스스로 결정했습니다.
500000 행으로 매우 간단한 테이블을 만들었습니다.
CREATE TABLE test(
ID INT(11) DEFAULT NULL,
Description VARCHAR(20) DEFAULT NULL
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;
그런 다음이 저장 프로 시저를 실행하여 임의의 데이터로 채 웁니다.
CREATE PROCEDURE randomizer()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE random CHAR(20) ;
theloop: loop
SET random = CONV(FLOOR(RAND() * 99999999999999), 20, 36);
INSERT INTO test VALUES (i+1, random);
SET i=i+1;
IF i = 500000 THEN
LEAVE theloop;
END IF;
END LOOP theloop;
END
그런 다음 간단한 SELECT, LIKE를 사용하여 SELECT 및 정렬 (ORDER BY를 사용하여 SELECT)을 벤치마킹하기 위해 다음 저장 프로 시저를 만들었습니다.
CREATE benchmark_simple_select()
BEGIN
DECLARE i INT DEFAULT 0;
theloop: loop
SELECT * FROM test WHERE Description = 'test' COLLATE utf8_general_ci;
SET i = i + 1;
IF i = 30 THEN
LEAVE theloop;
END IF;
END LOOP theloop;
END
CREATE PROCEDURE benchmark_select_like()
BEGIN
DECLARE i INT DEFAULT 0;
theloop: loop
SELECT * FROM test WHERE Description LIKE '%test' COLLATE utf8_general_ci;
SET i = i + 1;
IF i = 30 THEN
LEAVE theloop;
END IF;
END LOOP theloop;
END
CREATE PROCEDURE benchmark_order_by()
BEGIN
DECLARE i INT DEFAULT 0;
theloop: loop
SELECT * FROM test WHERE ID > FLOOR(1 + RAND() * (400000 - 1)) ORDER BY Description COLLATE utf8_general_ci LIMIT 1000;
SET i = i + 1;
IF i = 10 THEN
LEAVE theloop;
END IF;
END LOOP theloop;
END
위의 저장 프로 시저에서 utf8_general_ci 데이터 정렬이 사용되었지만 테스트 중에는 utf8_general_ci와 utf8_unicode_ci를 모두 사용했습니다.
각 데이터 정렬에 대해 각 저장 프로 시저를 5 회 (utf8_general_ci의 경우 5 회, utf8_unicode_ci의 경우 5 회) 호출 한 다음 평균값을 계산했습니다.
결과는 다음과 같습니다.
utf8_general_ci를 사용하는 benchmark_simple_select () : 9957 ms utf8_unicode_ci를 사용하는
benchmark_simple_select () : 10271 ms utf8_unicode_ci를
사용하는이 벤치 마크에서 utf8_unicode_ci를 사용하는 벤치 마크는 utf8_general_ci보다 3.2 % 느립니다.
utf8_general_ci를 사용하는 benchmark_select_like () : 11441ms utf8_unicode_ci를 사용하는
benchmark_select_like () : 12811ms utf8_unicode_ci를
사용하는이 벤치 마크에서 utf8_unicode_ci를 사용하는 벤치 마크는 utf8_general_ci보다 12 % 느립니다.
utf8_general_ci가있는 benchmark_order_by () : 11944ms utf8_unicode_ci가있는
benchmark_order_by () : 12887ms utf8_unicode_ci를
사용하는이 벤치 마크에서 utf8_unicode_ci를 사용하는 벤치 마크는 utf8_general_ci보다 7.9 % 느립니다.
답변
벤치 마크는 보이지 않지만 BENCHMARK 기능을 사용하여 직접 실행할 수 있습니다 .
벤치 마크 (수, 전문가)
Matthew의 조언에 따라 MYSQL의 병렬 설치를 실행할 수 있지만 다른 아키텍처 (sparc, intel, 32bit, 64bit 등) 사이에 큰 차이가있을 수 있다고 생각하십시오.