Utf8_unicode_ci বনাম utf8_general_ci এর প্রভাব পরিমাপ করার জন্য কি কোনও মাইএসকিউএল সম্পাদনা মানদণ্ড রয়েছে?


13

আমি এখানে এবং সেখানে পড়েছি যে utf8_unicode_ciকোলিশেশন ব্যবহার করে ইউনিকোড পাঠ্যের আরও ভাল চিকিত্সা নিশ্চিত করা হয় (উদাহরণস্বরূপ, এটি অনুসন্ধান এবং ক্রমের জন্য 'characters' এর মতো অক্ষরগুলি কীভাবে প্রসারিত করা যায় তা জানে) utf8_general_ciযা মূলত কেবল ডায়াক্রিটিক্সকে স্ট্রিপ করে। দুর্ভাগ্যবশত, উভয় উৎস নির্দেশ করে যে utf8_unicode_ciচেয়ে কিছুটা মন্থর হয় utf8_general_ci

সুতরাং আমার প্রশ্ন: "কিছুটা ধীর" মানে কী? কেউ কি বেঞ্চমার্ক চালিয়েছে? আমরা কি একটি -0.01% পারফরম্যান্স প্রভাব বা 25-25 এর মতো কিছু সম্পর্কে কথা বলছি?

আপনার সাহায্যের জন্য ধন্যবাদ.


যতদূর একটি বেঞ্চমার্ক হিসাবে, কোয়েরি সময়টি ব্যবহার করবেন না কেন? আমি বোকা হতে পারি তবে আপনি যদি কোনও ভিএম চালিয়ে যান এবং উভয় অক্ষরের এনকোডিংয়ের জন্য একটি জটিল জটিল ক্যোয়ারীতে ক্যোয়ারির সময়টি পরীক্ষা করেন তবে কী হবে? (এর আগে আমি এর জন্য বেঞ্চমার্কিং করতে দেখিনি)
অ্যাব্লু

উত্তর:


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

তারপরে আমি সাধারণ নির্বাচন করুন, পছন্দ ও পছন্দ অনুসারে বাছাইয়ের জন্য নিম্নোক্ত সঞ্চিত প্রক্রিয়াগুলি তৈরি করেছি (অর্ডার দিয়ে নির্বাচন করুন):

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 সহ
বেঞ্চমার্ক_সিম্পল_স लेक्ट (): 9957 এমএস বেঞ্চমার্ক_সিম্পল_স लेक्ट () সাথে utf8_unicode_ci: 10271 এমএস
এই বেঞ্চমার্কে utf8_unicode_ci ব্যবহার করে 3.2% অবধি utf8_general_ci থেকে ধীর হয়।

utf8_general_ci: 11441 এমএস
বেঞ্চমার্ক_সিলিট_লাইক () সাথে utf8_unicode_ci: 12811 এমএস
ব্যবহার করে এই বেঞ্চমার্কে utf8_unicode_ci ব্যবহার 12% দ্বারা utf8_general_ci এর চেয়ে ধীর হয়।

utf8_general_ci সহ বেঞ্চমার্ক_র্ডার_বি (): 11944 এমএস
বেঞ্চমার্ক_র্ডার_বি () দিয়ে utf8_unicode_ci: 12887 এমএস
এই বেঞ্চমার্কে utf8_unicode_ci ব্যবহার করে utf8_general_ci এর চেয়ে 7.9% কম ধীর হয়।


2

আমি কোনো বেঞ্চমার্ক দেখতে পাইনি, কিন্তু আপনি ব্যবহার করে নিজস্ব চালাতে পারেন মাত্রাবিশিষ্ট ফাংশন:

বেঞ্চমার্ক (গণনা, expr)

ম্যাথিউর পরামর্শ অনুসারে আপনি এমওয়াইএসকিউএল এর সমান্তরাল ইনস্টলেশন চালাতে পারেন তবে বিবেচনা করুন যে বিভিন্ন আর্কিটেকচার (স্পার্ক, ইন্টেল, 32 বিট, 64 বিট, ...) এর মধ্যে বিশাল পার্থক্য থাকতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.