क्या utf8_unicode_ci बनाम utf8_general_ci के प्रभाव को मापने के लिए एक MySQL प्रदर्शन बेंचमार्क है?


13

मैं यहां और वहां पढ़ता हूं कि utf8_unicode_ciकोलाज का उपयोग करने से यूनिकोड पाठ का एक बेहतर उपचार सुनिश्चित होता है (उदाहरण के लिए, यह ज्ञात है कि डिफ़ॉल्ट utf8_general_ciरूप से स्ट्रिप्स को खोजने के लिए और ऑर्डर करने के लिए 'ओ' जैसे वर्णों का विस्तार कैसे करना है) दुर्भाग्य से, दोनों स्रोत इंगित करते हैं कि utf8_unicode_ciतुलना में थोड़ा धीमा है utf8_general_ci

तो मेरा सवाल है: "थोड़ा धीमा" का क्या मतलब है? क्या किसी ने बेंचमार्क चलाया है? क्या हम -0.01% प्रदर्शन प्रभाव के बारे में बात कर रहे हैं या कुछ -25% की तरह?

आपकी सहायता के लिए धन्यवाद।


जहां तक ​​एक बेंचमार्क की बात है, तो क्वेरी समय का उपयोग क्यों नहीं करें? मैं एक बेवकूफ हो सकता हूं, लेकिन क्या होगा यदि आप एक वीएम को चलाते हैं और दोनों चरित्र एनकोडिंग के लिए एक बड़े जटिल क्वेरी पर क्वेरी समय का परीक्षण करते हैं? (मैंने पहले इसके लिए बेंचमार्किंग नहीं देखी है)
13

जवाबों:


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

तब मैंने निम्न संग्रहित प्रक्रियाओं को सरल चयन, बेंचमार्क के साथ चयन करने और क्रमबद्ध करने (ORD के साथ चयन) का निर्माण किया:

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 बार) और फिर औसत मानों की गणना की।

यहाँ परिणाम हैं:

utmark8_general_ci के साथ
बेंचमार्क_ simple_select (): 9957 ms बेंचमार्क_ simple_select () utf8_unicode_ci के साथ: 10271 ms
इस बेंचमार्क में ut88_unicode_ci का उपयोग utf8_general_ci से 3.2% कम है।

utf8_general_ci के साथ
बेंचमार्क_सेलेक्ट_इल (): utf8_unicode_ci: 12811 एमएस के साथ 11441 एमएस बेंचमार्क_सेलेक्ट_इसी ()
utf8_general_ci 12% से utf8_general_ci की तुलना में धीमी है।

utmark8_general_ci के साथ बेंचमार्क_ऑर्डर_बाइ (): 11944 एमएस
बेंचमार्क_ऑर्डर_बाय () utf8_unicode_ci के साथ: 12887 एमएस
इस बेंचमार्क में utf8_unicode_ci का उपयोग कर utf8_general_ci की तुलना में 7.9% धीमा है।


2

मैंने कोई बेंचमार्क नहीं देखा, लेकिन आप बेंचमार्क फ़ंक्शन का उपयोग करके अपना खुद का चला सकते हैं :

बेंचमार्क (गिनती, expr)

जैसा कि मैथ्यू ने सलाह दी है कि आप MYSQL की समानांतर स्थापना चला सकते हैं, लेकिन विचार करें कि विभिन्न वास्तुकला (स्पार्क, इंटेल, 32 बिट, 64 बिट, ...) के बीच एक बड़ा अंतर हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.