InnoDB ইঞ্জিন সহ সন্নিবেশে বিলম্ব কীভাবে ব্যবহার করবেন এবং সন্নিবেশ বিবৃতিগুলির জন্য কম সংযোগ ব্যবহার করবেন?


10

আমি এমন একটি অ্যাপ্লিকেশন নিয়ে কাজ করছি যার মধ্যে অনেকগুলি ডাটাবেস লিখেছে, প্রায় ~ 70% সন্নিবেশ এবং 30% পড়ে। এই অনুপাতের সাথে আপডেটগুলিও অন্তর্ভুক্ত থাকবে যা আমি একটি পঠিত এবং একটি লেখাকে বিবেচনা করি। সন্নিবেশ বিবৃতি মাধ্যমে একাধিক ক্লায়েন্ট নীচে সন্নিবেশ বিবৃতি মাধ্যমে ডাটাবেসে তথ্য sertোকান:

$mysqli->prepare("INSERT INTO `track` (user, uniq_name, ad_name, ad_delay_time ) values (?, ?, ?, ?)");

প্রশ্নটি হল আমি হয় insert_delay ব্যবহার করা বা mysqli_mલ્ટ_query প্রক্রিয়াটি ব্যবহার করা উচিত কারণ সন্নিবেশ বিবৃতিটি সার্ভারে ~ 100% সিপিইউ ব্যবহার করে। আমি আমার ডাটাবেসে InnoDB ইঞ্জিনটি ব্যবহার করছি তাই বিলম্ব করা সন্নিবেশ সম্ভব নয়। সার্ভারে সন্নিবেশ ~ 36k / ঘন্টা এবং 99.89% পঠিত, এছাড়াও আমি সিলেক্ট স্টেটমেন্ট ব্যবহার করছি সেখানে একক ক্যোয়ারীতে সাতবার তথ্য পুনরুদ্ধার করুন , এই ক্যোয়ারীটি কার্যকর করতে সার্ভারে 150 সেকেন্ড সময় নেয়। এই কাজের জন্য আমি কোন ধরণের কৌশল বা প্রক্রিয়া ব্যবহার করতে পারি? আমার সার্ভারের স্মৃতি 2 জিবি, আমি কি স্মৃতি প্রসারিত করব ?. এই সমস্যাটি দেখুন, যে কোনও পরামর্শ আমার কাছে কৃতজ্ঞ হবে।

টেবিলের কাঠামো:

+-----------------+--------------+------+-----+-------------------+----------------+
| Field           | Type         | Null | Key | Default           | Extra          |
+-----------------+--------------+------+-----+-------------------+----------------+
| id              | int(11)      | NO   | PRI | NULL              | auto_increment |
| user            | varchar(100) | NO   |     | NULL              |                |
| uniq_name       | varchar(200) | NO   |     | NULL              |                |
| ad_name         | varchar(200) | NO   |     | NULL              |                |
| ad_delay_time   | int(11)      | NO   |     | NULL              |                |
| track_time      | timestamp    | NO   | MUL | CURRENT_TIMESTAMP |                |
+-----------------+--------------+------+-----+-------------------+----------------+

আমার ডাটাবেস বর্তমান অবস্থা, এটি 41k সন্নিবেশ (লেখার) দেখায়, যা আমার ডাটাবেসের জন্য খুব ধীর।

ডাটাবেস স্থিতি


আপনি কি টেবিলের সংজ্ঞা সরবরাহ করতে পারেন? (সমস্ত কলাম, ডেটাটাইপ এবং সূচী)
ypercubeᵀᴹ

SHOW FULL PROCESSLIST100% সিপিইউ লাগলে আপনি কি একটি সংক্ষিপ্ত স্নিপেট দিতে পারেন ? এই সময়ে নেওয়া কতগুলি বনাম আপনি বনামকে অনুমতি দিচ্ছেন?
ডেরেক ডউনি

দয়া করে এই দুটি কোয়েরি চালান: SHOW GLOBAL VARIABLES LIKE 'innodb%';এবং SELECT VERSION();তাদের আউটপুট প্রদর্শন করুন।
RolandoMySQLDBA

আপনি চালিয়ে যাচ্ছেন প্রতি সেকেন্ডে সন্নিবেশকের সংখ্যা সরবরাহ করুন।
dabest1

আপনার কোডটি এসকিউএল ইনজেকশনের পক্ষে খুব সংবেদনশীল। প্রস্তুত বিবৃতি এবং পরামিতি মান ব্যবহার করুন।
অ্যারন ব্রাউন

উত্তর:


11

যেহেতু আপনার আরও লেখাগুলি রয়েছে তখন পড়েছেন, আমি নিম্নলিখিতগুলি সুপারিশ করতে চাই

InnoDB এর ড্রেস টিউনিং মূল হবে

বাফার পুল ( ইনোডাব_বফার_পুল_সাইজ আকারে )

যেহেতু InnoDB INSERT বিলম্বিত সমর্থন করে না , তাই একটি বড় InnoDB বাফার পুল ব্যবহার করা আপনি INSERT DELAYED এ পেতে পারেন এমন নিকটতম জিনিস। সমস্ত ডিএমএল (INSERTs, আপডেট, এবং মুছে ফেলা) InnoDB বাফার পুলে ক্যাশে হবে। রাইটদের জন্য লেনদেনের তথ্যগুলি সঙ্গে সঙ্গে রেডো লগগুলিতে লিখিত হয় (ib_logfile0, ib_logfile1)। বাফার পুলটিতে যে লেখাগুলি পোস্ট করা হয় সেগুলি নিয়মিত আইবডাতা 1 (সেকেন্ডারি ইনডেক্সের জন্য সন্নিবেশপুফ, ডাবল রাইট বাফার) এর মাধ্যমে মেমরি থেকে ডিস্কে ফ্লাশ করা হয়। বাফার পুলটি যত বড় হবে, তত বড় পরিমাণে INSERT কে ক্যাশে করা যায়। 8 জিবি বা তার বেশি র‌্যামযুক্ত সিস্টেমে র‌্যামের 75-80% ইনোডোড_বফার_পুল_সাইজ হিসাবে ব্যবহার করুন। খুব কম র‌্যামযুক্ত সিস্টেমে 25% (ওএস সমন্বিত করার জন্য)।

কভ্যাট: আরও লেখার গতি বাড়ানোর জন্য আপনি ইনোডাব_ডুব্লাইরাইট 0 তে সেট করতে পারেন তবে ডেটা অখণ্ডতার ঝুঁকিতে। ওএস-এ ইনোডিবি কেচিং প্রতিরোধ করতে আপনি ইনোডাব_ফ্লুশ_মোথোডিকে O_DIRECT এ সেট করে জিনিসগুলিকে গতি বাড়িয়ে দিতে পারেন।

পুনরায় লগগুলি ( ইনোডাব_লগ_ফাইলে_ সাইজ আকারে )

ডিফল্টরূপে, redo লগগুলির নামকরণ করা হয় ib_logfile0 এবং ib_logfile1 এবং প্রতিটি হবে 5MB। আকারটি ইনোডাব_বফার_পুল_সাইজের 25% হওয়া উচিত। যদি পুনরায় লগগুলি ইতিমধ্যে বিদ্যমান থাকে তবে my.cnf, শাটডাউন মাইএসকিএল-তে নতুন সেটিং যুক্ত করুন, সেগুলি মুছুন এবং মাইএসকিএল পুনরায় চালু করুন

লগ বাফার ( ইনোডাব_লগ_বাফলার_ সাইজ আকারে )

পুনরায় লগগুলিতে ফ্লাশ করার আগে লগ বাফারটি র‍্যামে পরিবর্তনগুলি ধারণ করে। ডিফল্ট 8M হয়। লগ বাফার যত বড় হবে, ডিস্ক I / O তত কম। খুব বড় লেনদেন সম্পর্কে সতর্ক থাকুন, কারণ এটি মিলিসেকেন্ডের মাধ্যমে COMMITs কমিয়ে দিতে পারে।

একাধিক সিপিইউ অ্যাক্সেস করা হচ্ছে

মাইএসকিউএল 5.5 এবং মাইএসকিউএল 5.1 ইনোডিবি প্লাগইনটিতে ইনোডিবি স্টোরেজ ইঞ্জিনের একাধিক সিপিইউ অ্যাক্সেস করার সেটিংস রয়েছে। আপনাকে যে বিকল্পগুলি সেট করতে হবে তা এখানে রয়েছে:

  • ইনোডব_থ্রেড_কেনসিটি ইনোডিবি খোলার মতো সামঞ্জস্যপূর্ণ থ্রেডের সংখ্যার উপরের সীমাটি সেট করে। সাধারণত এটির জন্য সিপাই করার পরামর্শ দেওয়া হয় (সিপিইউগুলির 2 এক্স সংখ্যা) + ডিস্কের সংখ্যা। গত বছর, আমি পেরকোনা এনওয়াইসি সম্মেলন থেকে প্রথম থেকেই শিখেছি যে ইনোএনডিবি স্টোরেজ ইঞ্জিনটি যে পরিবেশে চলছে তার সর্বাধিক সংখ্যক থ্রেড সন্ধানের জন্য আপনাকে এটিকে 0 তে সেট করতে হবে।
  • ইনোডব_কনক্রেন্সি_টিকেটগুলি থ্রেডের সংখ্যা নির্ধারণ করে যা দায়মুক্তির সাথে সম্মতিযুক্ত চেকিং বাইপাস করতে পারে। এই সীমাটি পৌঁছে যাওয়ার পরে, থ্রেড সম্মতিযুক্ত চেকিং আবার আদর্শ হয়ে যায়।
  • ইনোডব_কমিট_ কনকুরেন্সি প্রতিশ্রুতিবদ্ধ হতে পারে এমন সমবর্তী লেনদেনের সংখ্যা সেট করে। যেহেতু ডিফল্ট 0 হয় তাই এটি সেট না করে কোনও সংখ্যক লেনদেন একই সাথে কমিট করার অনুমতি দেয়।
  • ইনডোডবি_থ্রেড_স্লিপ_ডিলে ইনোডিবি ক্যুতে প্রবেশের আগে একটি ইনোডিবি থ্রেড সুপ্ত হতে পারে মিলসেকেন্ডের সংখ্যা নির্ধারণ করে। ডিফল্ট 10000 (10 সেকেন্ড)।
  • ইনোডব_ড্রেড_ও_থ্রেডস (এটি 3000 এ সেট করুন) এবং ইননোডবি_উইট_আইও_থ্রেডস (এটি 7000 নির্ধারণ করুন) (মাইএসকিউএল 5.1.38 যেহেতু উভয়ই) পড়া এবং লেখার জন্য নির্দিষ্ট সংখ্যক থ্রেড বরাদ্দ করে। ডিফল্ট 4 এবং সর্বাধিক 64 হয়। এগুলিকে 64 এ সেট করুন Also এছাড়াও, ইনোডাব_ও_ক্যাপাসিটিটি 10000 এ সেট করুন ।

মাইএসকিউএল 5.5 এ আপগ্রেড করুন

আপনার যদি মাইএসকিউএল 5.0 থাকে তবে মাইএসকিউএল 5.5 এ আপগ্রেড করুন। আপনার যদি মাইএসকিউএল 5.1.37 বা তার আগে থাকে তবে মাইএসকিউএল 5.5 এ আপগ্রেড করুন। আপনার যদি মাইএসকিউএল 5.1.38 বা তারও বেশি থাকে এবং মাইএসকিউএল 5.1 এ থাকতে চান তবে ইনোডিবি প্লাগইন ইনস্টল করুন। এইভাবে, আপনি InnoDB এর জন্য সমস্ত সিপিইউর সুবিধা নিতে পারেন।


আমার সার্ভারের মেমোরি 2 জিবি, সুতরাং মেমরি অনুসারে আমি ইনোডাব বাফার পুল 500M তে সেট করেছিলাম এবং 25% পুলে লগ করে, লগ বাফারটি 64 এম তে সেট করে। তবে এখনও সার্ভার ভারী ব্যস্ত। আমি স্মৃতি আপগ্রেড করা উচিত? এছাড়াও আমার সার্ভারটি 32 বিট উবুন্টুতে রয়েছে, তাই সর্বোচ্চ আমি 4 গিগাবাইটে মেমরি সেট করতে পারি।
শশাঙ্ক

যদি সার্ভারটি কেবল মাইএসকিউএল (কোনও অ্যাপাচি, কোনও পিএইচপি নয়) এর জন্য থাকে, তবে ইনোডাব_বফার_পুল_সাইজ 2GB এর 75% হতে পারে যা 1536M। আপনি যদি 4 জিবিতে আপগ্রেড করেন তবে ইনোডাব_বফার_পুল_সাই 3 জি হতে পারে। লগ ফাইলগুলি আপনার উল্লেখ অনুযায়ী বাফার পুলের 25% হওয়া উচিত।
রোল্যান্ডোমাইএসকিউএলডিবিএ

সার্ভারটি অ্যাপাচি 2, মাইএসকিএল এবং পিএইচপিএল চলছে, আমি কি এই পরিস্থিতিতে আপগ্রেড মেমোরির জন্য যেতে পারি বা ইনোডাব বাফার পুল ছাড়া কোনও অনুকূল সমাধান আছে?
শশাঙ্ক

এই লোকটি আপনার সাথে একমত নয়: percona.com/blog/2008/11/21/… পারকোনার সাথে তর্ক করা শক্ত।
জেনেক্সার

রোল্যান্ডো - আপনাকে 5.6 এবং 5.7 আপডেটের সাথে উত্তরটিতে যুক্ত করার পরামর্শ দিন। ডিফল্ট পরিবর্তন হয়েছে; অন্যান্য সেটিংস উপলব্ধ; ইত্যাদির মধ্যে পারকোনা এবং মারিয়াডিবি এবং 8.0 টিপস অন্তর্ভুক্ত থাকতে পারে।
রিক জেমস

2

INT (2) এখনও 4 টি বাইট ব্যবহার করে - সম্ভবত আপনি TINYINT UNSIGNED বলতে চাইছেন?

সেত্নোতে কয়টি আলাদা মান? এটি যদি ছোট হয় তবে কেইওয়াই (সেটনো) কখনই ব্যবহার করা হবে না। INSERTing কে সেই সূচকটি আপডেট করতে হবে; KEY অপসারণ কিছু সংঘটিত হবে।

চর (10) - flagসবসময় 10 অক্ষর দীর্ঘ হয়? এবং utf8 এ? সম্ভবত আপনি পতাকাটি মার্চচার (10) অক্ষর সেট আসকি ব্যবহার করতে পারেন

আপনার সন্নিবেশগুলিতে ব্যাচ করুন - একসাথে 100 দ্রুত 10 বার হিসাবে দ্রুত চলবে। (100 এরও বেশি 'হ্রাসকারী রিটার্নে' নামছে is)

অটোকমিটের মান কত? আপনি কি প্রতিটি ইনসার্টটি শুরু করছেন ... কমিট? ইনোডাব_ফ্লুশ_লগ_এট_আরটিএক্স_কমিটের মান কত?


বহিরাগত উত্সের মাধ্যমে বিভিন্ন মান সহ বিভিন্ন ক্লায়েন্টের মতো ডেটা codeifোকানো হলে আমি কীভাবে ব্যাচে সন্নিবেশ করবো .... যদি আমি ব্যবহার করি তবে এটি কি নির্ভরযোগ্য: t_name (কল 1, কল 2, কল 3) মানগুলিতে সন্নিবেশ করান (মান 1, ভাল 2, ভাল 3), (ভাল 1, ভাল 2, ভাল 3), (ভাল 1, ভাল 2, ভাল 3), (ভাল 1, ভাল 2, ভাল 3), (ভাল 1, ভাল 2, ভাল 3); code
শশাঙ্ক

1

একটি সারি সেট আপ করুন। অ্যাপ্লিকেশনটি একবারে একটি সারিতে 1 টি সারিতে লিখবে এবং তারপরে সারিগুলি সরিয়ে নিয়ে শেষ সন্নিবেশ থেকে পাস হওয়া সময়ের পরিমাণের উপর ভিত্তি করে ব্যাচে একটি ডাটাবেস প্রবেশ করিয়েছিল।

আমি দেখেছি যেখানে একবারে 10,000 টি সন্নিবেশ করানো সবচেয়ে দ্রুত, তাই আপনার একটি মিষ্টি স্পট সন্ধান করার জন্য আপনাকে পরীক্ষা করতে হবে।

আপনি নিজের নিজস্ব সহজ সারি সিস্টেম তৈরি করতে বা বিদ্যমান একটি ব্যবহার করতে পারেন। এখানে কয়েকটি উদাহরণ: হর্নেটকিউ এবং ফাইল :: ক্যু । এখানে আরও কিছু ভাল বিকল্পের তালিকা এসইতে একটি পোস্ট রয়েছে: পার্ল, পিএইচপি, পাইথনে বার্তাগুলির সারি


আমি এই পদ্ধতির সাথে একমত - আমি এক অ্যাপে প্রতি 5 সেকেন্ডে 1500 ডলার সন্নিবেশ করিতেছি এবং এটি দ্বিতীয় সেকেন্ডে রয়েছে। মাইএসকিএল অভ্যন্তরীণভাবে এমন কিছু প্রক্রিয়া প্রয়োগ করেছে যা ব্যাচের সন্নিবেশগুলি সত্যই দ্রুত ঘটায়।
ডন উলের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.