মাইএসকিএল: 1.4 বিলিয়ন রেকর্ডে সূচক তৈরি করুন


9

আমার কাছে 1.4 বিলিয়ন রেকর্ড সহ একটি টেবিল রয়েছে। টেবিলের কাঠামোটি নিম্নরূপ:

CREATE TABLE text_page (
    text VARCHAR(255),
    page_id INT UNSIGNED
) ENGINE=MYISAM DEFAULT CHARSET=ascii

প্রয়োজনটি কলামের উপরে একটি সূচক তৈরি করা text

টেবিলের আকার প্রায় 34G।

আমি নিম্নলিখিত বিবৃতি দ্বারা সূচক তৈরি করার চেষ্টা করেছি:

ALTER TABLE text_page ADD KEY ix_text (text)

10 ঘন্টা অপেক্ষা করার পরে অবশেষে আমি এই পদ্ধতির ত্যাগ করি।

এই সমস্যার কোনও কার্যক্ষম সমাধান আছে কি?

আপডেট : সারণীটি আপডেট হওয়া বা sertedোকানো বা মোছার সম্ভাবনা নেই। কলামে সূচী তৈরির textকারণ হ'ল এই ধরণের স্ক্যাল কোয়েরিটি প্রায়শই সম্পাদিত হত:

SELECT page_id FROM text_page WHERE text = ?

আপডেট : আমি টেবিলটি বিভাজন করে সমস্যার সমাধান করেছি।

টেবিলটি কলামে 40 টুকরা হয়ে বিভক্ত text। তারপরে টেবিলে সূচক তৈরি করতে প্রায় 1 ঘন্টা সময় লাগে।

দেখে মনে হচ্ছে টেবিলের আকারটি খুব বড় হয়ে গেলে মাইএসকিউএল সূচকটি তৈরি করা খুব ধীর হয়ে যায়। এবং বিভাজন টেবিলকে ছোট ছোট ট্রাঙ্কগুলিতে হ্রাস করে।


1
নরমাল CREATE INDEXস্টেটমেন্ট ব্যবহার করে কী ভুল ?

আমি পরামর্শ দিচ্ছি যে সার্ভারফল্টে এই প্রশ্নটি আরও ভাল হতে পারে - এটি কোনও প্রোগ্রামিং প্রশ্নের চেয়ে ডিবি অ্যাডমিনের বেশি।
সেখান থেকে

@ ডার্ক: সাধারণ ক্রিয়েট ইন্ডেক্স এক্সপ্রোস খুব ধীর। আমাকে 1 দিনের মধ্যে কাজটি শেষ করতে হবে।

1
হুম ... আমি মনে করি না আপনি এটিকে ঘিরে ফেলতে পারেন। সূচক তৈরির জন্য ডিবিএমএসকে সমস্ত রেকর্ডের মাধ্যমে স্ক্যান করা, তাদের "পাঠ্য" ক্ষেত্রগুলি সংগ্রহ করা এবং সংশ্লিষ্ট বৃক্ষ নোডগুলি / সাবট্রিজগুলি সন্নিবেশ করা / পরিবর্তন করতে হবে। এবং
34G এর

আপনার ডিবি সার্ভারের কত স্মৃতি রয়েছে? আপনি মাইএসকিউএলকে সেই সমস্ত স্মৃতি ব্যবহার করার জন্য কনফিগার করেছেন, না এটি নিজেই সীমাবদ্ধ করছে?

উত্তর:


4

এটি কি আপনার সিস্টেমের কাজটি শেষ হতে পারে? আমি মাইএসকিউএল (এসকিউএল সার্ভার এখানে) ব্যবহার করি না, তবে আমি 800 মিলিয়ন এন্ট্রি টেবিলকে ইনডেক্স করার ব্যথা জানি। মূলত .... এর জন্য আপনার সঠিক হার্ডওয়্যার প্রয়োজন (যেমন: প্রচুর ফাস্ট ডিস্ক)। আমি এখন প্রায় এক ডজন ভেলোসিরাপ্টার ব্যবহার করি এবং অভিনয়টি দুর্দান্ত;)

এসকিউএল সার্ভারগুলি (এমএস এসকিউএল সার্ভার হিসাবে নয়, তবে এসকিউএল ব্যবহার করে ডেটাবেস সার্ভার হিসাবে) ডিস্ক অ্যাক্সেসের সাথে লাইভ এবং ডাই হয়ে থাকে এবং সাধারণ ডিস্কগুলি বৃহত্তর ক্রিয়াকলাপগুলির উপর নির্ভর করে না।


আমার সন্দেহ হ'ল রেকর্ড গণনাটি ছোট হলে সূচক তৈরি করা খুব দ্রুত হয়; বলে, মিলিয়ন। গণনা যখন বিলিয়নে হয় তখন সূচক তৈরি এত ধীর হয়ে যায়। সময়ের বৃদ্ধি ব্যয়কর হিসাবে মনে হচ্ছে।

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

4

আপনি প্রথমে পাঠ্য ক্ষেত্রের অক্ষর (উদাহরণস্বরূপ, 10) অক্ষর তৈরি করতে চাইতে পারেন।

দস্তাবেজ থেকে:

সূচকগুলি তৈরি করা যেতে পারে যে কলাম মানগুলির শীর্ষস্থানীয় অংশ ব্যবহার করে, একটি সূচক উপসর্গ দৈর্ঘ্য নির্দিষ্ট করতে কল_নেম (দৈর্ঘ্য) সিনট্যাক্স ব্যবহার করে:

CREATE INDEX ix_text ON text_page (text(10))

4

আমি টেবিলটি বিভাজন করে সমস্যার সমাধান করেছি।

টেবিলটি কলামে 40 টুকরা হয়ে বিভক্ত text। তারপরে টেবিলে সূচক তৈরি করতে প্রায় 1 ঘন্টা সময় লাগে।

দেখে মনে হচ্ছে টেবিলের আকারটি খুব বড় হয়ে গেলে মাইএসকিউএল সূচকটি তৈরি করা খুব ধীর হয়ে যায়। এবং বিভাজন টেবিলকে ছোট ছোট ট্রাঙ্কগুলিতে হ্রাস করে।


তাহলে 40 x 1 ঘন্টা 10 ঘন্টা কম হয়?
সিমকিয়ান

3

বাছাই_বাফার_সাইজকে 4 জিবিতে সেট করুন (অথবা আপনি কতটা মেমোরি রেখেছেন তার উপর নির্ভর করে)

এখনই তৈরি সূচকটি বাছাই করছে তবে যেহেতু আপনার কাছে 32 এমবি সাজানো_বফার_সাইজ রয়েছে তাই এটি মূলত হার্ড ড্রাইভটিকে অকারণে ছোঁড়াচ্ছে।


এই পোস্টগুলি আপনার সাথে সরাসরি সরাসরি দ্বিমত পোষণ করছে: xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size এবং আরও ভাল রোনাল্ডব্রাডফোর্ড.com/blog/… মনে হচ্ছে এটি কোনও বিশ্বব্যাপী মান নয়, এটি প্রতি-ক্যোয়ারী, যাতে আপনার প্রস্তাবিত ক্যোয়ারী 4 জিবি। এছাড়াও, যখন এটি 256K ছাড়িয়ে যায় তখন এটি মেমরির প্রকৃত ইন-মেমরির চেয়ে ডিস্কে মেম-ম্যাপযুক্ত হয়। আপনি যদি এটি ছোট রাখেন তবে এটির জন্য একাধিক পাসের প্রয়োজন, তবে এটি ডিস্ক এড়িয়ে চলে (এটি বদল হয় না)।
Ry4an ব্রাস

3

আপনার যদি এমন প্রশ্নের প্রয়োজন হয় না:

SELECT page_id FROM text_page WHERE text LIKE '?%';

আমি একটি নতুন হ্যাশ কলাম তৈরি করার পরামর্শ দেব এবং কলাম অনুসারে টেবিলটি সূচী করব। টেবিল + সূচকের ওভারাল আকারটি আরও ছোট হতে পারে।

ইউপিডি : যাইহোক, 1.4 বিলিয়ন প্রাথমিক কী পূর্ণসংখ্যা প্রায় 6 গিগাবাইট দখল করে, এটি স্ট্রিংয়ের গড় দৈর্ঘ্য 30 টির চেয়ে কম বর্ণের হয়, এটি একটি উপসর্গের উপর সূচীকরণ করা আরও বেশি পছন্দনীয় হতে পারে।

MERGE স্টোরেজ ইঞ্জিনটিও একবার দেখে নেওয়া উচিত ।


2

এটি করার একটি উপায় হ'ল সূচক সেট সহ একটি নতুন টেবিল তৈরি করা এবং ডেটাটি নতুন টেবিলটিতে অনুলিপি করা।

এছাড়াও, আপনার পর্যাপ্ত অস্থায়ী জায়গা রয়েছে তা নিশ্চিত করুন।


1
আমি এই পদ্ধতির চেষ্টা করেছি। 10 ঘন্টা পরে 1% এরও কম ডেটা নতুন টেবিলটিতে অনুলিপি করা হয়েছে।

1
ডুড ... এটি 1.4 বিলিয়ন রেকর্ডস। মিলিয়ন নয়, বিলিয়ন। এটাই অনেক. নির্বিশেষে কিছুটা সময় লাগবে।

আপনি যদি এই পদ্ধতিটি বেছে নিতে চান তবে অনুলিপিটিকে ছোট ছোট ভাগে ভাগ করুন। প্রতিটি অনুলিপিটির জন্য প্রায় 100 থেকে 200 মিলিয়ন বলুন।

1
@ পচিয়ে গেছে, এটিকে ছোট ছোট ভাগে ভাঙা কিছু করবে না (আসলে, এটি এটিকে কম দক্ষ করে তুলবে)। @ ব্রায়ান, এমনকি ১.৪ বিলিয়ন রেকর্ড থাকা সত্ত্বেও এটি এক হাজার ঘন্টা সময় নেয় না take

0

আপনি যদি এখনও এই সেরাটি করবেন কীভাবে ভাবছেন তবে আমি আপনাকে একটি অনলাইন অল্টার টেবিল সরঞ্জাম ব্যবহার করার পরামর্শ দিচ্ছি।

ইন্টারনেটে তাদের প্রচুর পরিমাণ রয়েছে, বিখ্যাতদের মধ্যে অন্যতম:

  • Percona অনলাইন স্কিমা পরিবর্তন করুন (আমি এই এক ব্যবহার করুন)
    http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html
  • ফেসবুক ওএসসি, আপনি এটি ডাউনলোড করতে পারেন এমন কোনও URL খুঁজে পাচ্ছি না

বড় টেবিলগুলির সাথে আমাদের একই সমস্যা রয়েছে (আরও 500 মিলিল রেকর্ডগুলি পরে) এবং পরিবর্তনটি নিখুঁত হয় goes এটি একটি নতুন টিএমপি টেবিল তৈরি করে, মূল টেবিলটিতে ট্রিগার যুক্ত করে (নতুন আপডেটের জন্য / মুছুন / সন্নিবেশ করানো রেকর্ডগুলির জন্য) এবং মাঝামাঝি সময়ে এটি সমস্ত রেকর্ড নতুন টেবিলে অনুলিপি করে (নতুন কাঠামো সহ)

শুভকামনা!

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