utf8_unicode_ci와 utf8_general_ci의 영향을 측정하기위한 MySQL 성능 벤치 마크가 있습니까? 와 거기에

내가 읽은 여기거기에 사용하여 해당 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 등) 사이에 큰 차이가있을 수 있다고 생각하십시오.