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


13

내가 읽은 여기거기에 사용하여 해당 utf8_unicode_ci데이터 정렬하는 유니 코드 문자의 더 나은 대우를 보장 기본에 비해 (예를 들어, 검색 및 주문에 대한 'OE'에 같은 문자 'œ'을 확장하는 방법을 과학적 이해) utf8_general_ci기본적으로 그냥 분음 부호를 제거합니다. 불행히도 두 소스는 모두 utf8_unicode_ci보다 약간 느립니다 utf8_general_ci.

제 질문은 "약간 느리다"는 무엇을 의미합니까? 누구든지 벤치 마크를 실행 했습니까? -0.01 %의 성능 영향 또는 -25 %와 비슷한 것에 대해 이야기하고 있습니까?

당신의 도움을 주셔서 감사합니다.


벤치 마크에서 쿼리 시간을 사용하지 않는 이유는 무엇입니까? 나는 바보 일지 모르지만 VM을 실행하고 두 문자 인코딩 모두에 대해 큰 복잡한 쿼리에서 쿼리 시간을 테스트하면 어떻게됩니까? (이전에 벤치마킹을 한 적이 없다)
Ablue

답변:


8

인터넷에서 벤치 마크를 찾지 못해서 벤치 마크를 스스로 결정했습니다.

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 % 느립니다.


2

벤치 마크는 보이지 않지만 BENCHMARK 기능을 사용하여 직접 실행할 수 있습니다 .

벤치 마크 (수, 전문가)

Matthew의 조언에 따라 MYSQL의 병렬 설치를 실행할 수 있지만 다른 아키텍처 (sparc, intel, 32bit, 64bit 등) 사이에 큰 차이가있을 수 있다고 생각하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.