6.1 ভূমিকা
এখন তত্ত্ব থেকে অনুশীলনে যাওয়া যাক।
আমরা বাস্তব জগতে বাস করি এবং সমস্ত সফ্টওয়্যার পণ্য শেষ পর্যন্ত জীবিত মানুষের জন্য তৈরি করা হয়। এবং এই জীবিত মানুষ খুব বিরক্ত হয় যে সাইটগুলি ধীরে ধীরে লোড হয়, এবং প্রোগ্রামগুলি যা ধীর হয়ে যায়।
এবং যদি একটি ডাটাবেস ক্যোয়ারী এক সেকেন্ডের বেশি সময় নেয়, এটি অগ্রহণযোগ্য । ব্যবহারকারীরা কেবল এমন একটি পণ্য ব্যবহার করবেন না যার পৃষ্ঠা/কার্যকারিতা এত ধীর।
কিন্তু প্রায়ই, একটি পৃষ্ঠা প্রদর্শন করার জন্য, আপনাকে ডাটাবেসে কয়েক ডজন প্রশ্ন করতে হবে। এবং যদি সেগুলি ক্রমানুসারে কার্যকর করা হয়, তাহলে আপনার আর দ্বিতীয় সীমা থাকবে না, তবে প্রতি অনুরোধে 100ms বলা যাক।
এখানে শীর্ষ 5 উপায়ে প্রোগ্রামাররা ডাটাবেস প্রশ্নের গতি বাড়ায়:
- ডাটাবেসের টেবিলে সূচী যোগ করা।
- প্রশ্ন পুনর্লিখন এবং অপ্টিমাইজ করা.
- ডাটাবেসের পাশে ক্যাশিং সক্ষম করুন (এবং কনফিগার করুন)।
- ক্লায়েন্ট সাইডে ক্যাশিং সক্ষম করুন।
- ডাটাবেস ডিনরমালাইজেশন সঞ্চালন.
আপনি ইতিমধ্যে বেশিরভাগ অংশের জন্য এই সমস্ত জিনিসগুলির সাথে পরিচিত, তাই নিম্নলিখিতগুলি শুধুমাত্র ব্যবহারিক পরামর্শ হবে।
6.2 সূচক
এটি কোনও গোপন বিষয় নয় যে একটি ডাটাবেসের সাথে কাজ করা প্রায় কোনও সাইটের বেশিরভাগ কাজ নেয়। এবং এটি ডাটাবেসের সাথে কাজ করছে যা প্রায়শই ওয়েব অ্যাপ্লিকেশনগুলির বাধা।
এই নিবন্ধে আমি MySQL ব্যবহার সম্পর্কে ব্যবহারিক পরামর্শ দিতে চাই।
আমি এখনই বলব:
- এই নিবন্ধটি মাইএসকিউএল সম্পর্কে লেখা হয়েছে, যদিও সাধারণ জিনিসগুলি যে কোনও ডিবিএমএসের জন্য সত্য হতে পারে।
- নিবন্ধে লেখা সবকিছুই আমার ব্যক্তিগত দৃষ্টিকোণ, এবং চূড়ান্ত সত্য নয়।
- উপদেশ নতুন বলে ভান করে না এবং এটি পঠিত সাহিত্য এবং ব্যক্তিগত অভিজ্ঞতার সাধারণীকরণের ফলাফল।
- এই নিবন্ধের কাঠামোর মধ্যে, আমি MySQL কনফিগারেশন সমস্যাগুলি স্পর্শ করব না।
MySQL ব্যবহার করার সময় সমস্যাগুলি নিম্নলিখিত তিনটি গ্রুপে বিভক্ত করা যেতে পারে (গুরুত্ব অনুসারে):
- সূচকের অ-ব্যবহার বা অপব্যবহার।
- ভুল ডাটাবেস গঠন.
- ভুল \ সাবঅপ্টিমাল এসকিউএল প্রশ্ন।
আসুন এই গোষ্ঠীগুলির প্রতিটিকে ঘনিষ্ঠভাবে দেখে নেওয়া যাক।
ইনডেক্স ব্যবহার করে
সূচী ব্যবহার না করা বা অপব্যবহার করা প্রায়শই প্রশ্নের গতি কমিয়ে দেয়। যারা সূচকগুলি কীভাবে কাজ করে তার পদ্ধতির সাথে পরিচিত নন বা ম্যানুয়ালটিতে এটি সম্পর্কে এখনও পড়েননি, আমি আপনাকে এটি পড়ার জন্য দৃঢ়ভাবে পরামর্শ দিচ্ছি।
সূচী ব্যবহার করার জন্য টিপস:
- আপনার সবকিছু সূচী করার দরকার নেই । প্রায়শই, অর্থ না বুঝে, লোকেরা কেবল একটি টেবিলের সমস্ত ক্ষেত্রকে সূচী করে। সূচীগুলি আনার গতি বাড়ায়, কিন্তু সারি সন্নিবেশ এবং আপডেটগুলিকে ধীর করে দেয়, তাই প্রতিটি সূচকের পছন্দ অবশ্যই অর্থপূর্ণ হতে হবে৷
- সূচকের বৈশিষ্ট্যযুক্ত প্রধান পরামিতিগুলির মধ্যে একটি হল নির্বাচনযোগ্যতা, যা সূচকের বিভিন্ন উপাদানের সংখ্যা। দুই বা তিনটি সম্ভাব্য মান আছে এমন একটি ক্ষেত্রকে সূচী করার কোন মানে নেই। এই ধরনের সূচক থেকে সামান্য সুবিধা হবে।
- সূচী পছন্দ একটি প্রদত্ত টেবিলের বিরুদ্ধে সমস্ত প্রশ্নের বিশ্লেষণ দিয়ে শুরু করা উচিত। খুব প্রায়ই, এই জাতীয় বিশ্লেষণের পরে, তিন বা চারটি সূচকের পরিবর্তে, আপনি একটি যৌগিক একটি তৈরি করতে পারেন।
- যৌগিক সূচক ব্যবহার করার সময়, সূচকের ক্ষেত্রের ক্রম গুরুত্বপূর্ণ।
- সূচী কভার সম্পর্কে ভুলবেন না. যদি একটি কোয়েরির সমস্ত ডেটা একটি সূচক থেকে পুনরুদ্ধার করা যায়, তাহলে MySQL সরাসরি টেবিলে প্রবেশ করবে না। এই ধরনের অনুরোধ খুব দ্রুত কার্যকর করা হবে. উদাহরণস্বরূপ,
SELECT name FROM user WHERE login='test'
একটি সূচক (লগইন, নাম) সহ একটি প্রশ্নের জন্য, টেবিলে অ্যাক্সেসের প্রয়োজন নেই। কখনও কখনও এটি একটি যৌগিক সূচকে একটি অতিরিক্ত ক্ষেত্র যোগ করা বোধগম্য হয়, যা সূচক কভার করে এবং প্রশ্নগুলির গতি বাড়াবে। - সারি সূচীগুলির জন্য, এটি প্রায়ই সারির শুধুমাত্র অংশ সূচী করার জন্য যথেষ্ট। এটি উল্লেখযোগ্যভাবে সূচক আকার কমাতে পারে।
%
এটি শুরুতে থাকলে ,LIKE(SELECT * FROM table WHERE field LIKE '%test')
সূচী ব্যবহার করা হবে না।- FULLTEXT সূচকটি শুধুমাত্র MATCH ... AGAINST বাক্য গঠনের সাথে ব্যবহার করা হয় ।
6.3 ডাটাবেস গঠন
একটি ভাল-পরিকল্পিত ডাটাবেস ডাটাবেসের সাথে দ্রুত এবং দক্ষ কাজের মূল চাবিকাঠি। অন্যদিকে, একটি খারাপভাবে ডিজাইন করা ডাটাবেস সবসময় ডেভেলপারদের জন্য মাথাব্যথা হয়ে থাকে।
ডাটাবেস ডিজাইন টিপস:
- সম্ভাব্য ক্ষুদ্রতম ডেটা প্রকারগুলি ব্যবহার করুন। ডাটা টাইপ যত বড় হবে, টেবিল তত বড় হবে, ডেটা পাওয়ার জন্য তত বেশি ডিস্ক অ্যাক্সেসের প্রয়োজন হবে। একটি খুব সুবিধাজনক পদ্ধতি ব্যবহার করুন:
SELECT * FROM table_name PROCEDURE ANALYSE();
ন্যূনতম সম্ভাব্য ডেটা প্রকার নির্ধারণ করতে। - নকশা পর্যায়ে স্বাভাবিক ফর্ম পর্যবেক্ষণ. প্রায়শই প্রোগ্রামাররা এই পর্যায়ে ইতিমধ্যেই অস্বাভাবিককরণের আশ্রয় নেয়। যাইহোক, বেশিরভাগ ক্ষেত্রে, প্রকল্পের শুরুতে, এটি কীভাবে ফলাফল হতে পারে তা স্পষ্ট নয়। সাব-অপটিমালি ডিনরমালাইজডের থেকে ভুগতে চেয়ে একটি টেবিলকে ডিনরমালাইজ করা অনেক সহজ। এবং
JOIN
কখনও কখনও এটি ভুলভাবে ডিনরমালাইজড টেবিলের চেয়ে দ্রুত কাজ করে। NULL
আপনার সচেতনভাবে প্রয়োজন না হলে কলামগুলি ব্যবহার করবেন না ।
6.4 SQL প্রশ্ন।
ঠিক যেমন প্রায়ই নেটিভ এসকিউএল-এ সমস্ত প্রশ্ন পুনরায় লেখার ইচ্ছা থাকে যাতে ক্যোয়ারী যত দ্রুত সম্ভব হয়। আপনি যদি এটি করার সিদ্ধান্ত নেন, তাহলে এখানে কিছু টিপস রয়েছে:
- একটি লুপে অনুরোধ এড়িয়ে চলুন. এসকিউএল হল সেটের একটি ভাষা, এবং লেখার প্রশ্নগুলি ফাংশনের ভাষায় নয়, সেটের ভাষায় যোগাযোগ করা উচিত।
*
প্রশ্নে (তারকা) এড়িয়ে চলুন । আপনি যে ক্ষেত্রগুলি বেছে নিয়েছেন তা বিনা দ্বিধায় তালিকাভুক্ত করুন৷ এটি আনা এবং পাঠানো ডেটার পরিমাণ হ্রাস করবে। এছাড়াও, সূচী কভার সম্পর্কে ভুলবেন না. এমনকি যদি আপনি টেবিলের সমস্ত ক্ষেত্র নির্বাচন করেন তবে তাদের তালিকা করা ভাল। প্রথমত , এটি কোডের পঠনযোগ্যতা উন্নত করে। তারকাচিহ্নগুলি ব্যবহার করার সময়, টেবিলে কী ক্ষেত্র রয়েছে তা খুঁজে বের করা অসম্ভব। দ্বিতীয়ত , আজ আপনার টেবিলে পাঁচটি INT কলাম রয়েছে, এবং এক মাস পরে আরও একটি TEXT এবং BLOB যোগ করা হয়েছে , এবং তারকাচিহ্নটি আগের মতোই রয়ে গেছে।- পেজিন করা হলে, রেকর্ডের মোট সংখ্যা পেতে, ব্যবহার করুন
SQL_CALC_FOUND_ROWS
এবংSELECT FOUND_ROWS();
কখন ব্যবহার করা হয়SQL_CALC_FOUND_ROWS MySQL
, নির্বাচিত সংখ্যক সারি ক্যাশে করে (লিমটি প্রয়োগ করার আগে), এবং যখন ব্যবহার করা হয়, তখনSELECT FOUND_ROWS()
ক্যোয়ারী পুনরায় চালানো ছাড়াই শুধুমাত্র এই ক্যাশে করা মানটি ফেরত দেয়। - ভুলে যাবেন না যে
INSERT
একাধিক সন্নিবেশের জন্য একটি সিনট্যাক্স রয়েছে। একটি ক্যোয়ারী একটি লুপে একাধিক প্রশ্নের চেয়ে দ্রুত মাত্রার একটি অর্ডার চালাবে। LIMIT
যেখানে আপনার সমস্ত ডেটার প্রয়োজন নেই সেখানে ব্যবহার করুন ।INSERT… ON DUPLICATE KEY UPDATE…
নির্বাচনের জায়গায় এবংINSERT
বা পরে ব্যবহার করুনUPDATE
, এবং প্রায়শই এর জায়গায়REPLACE
।- এই আশ্চর্যজনক বৈশিষ্ট্য ভুলবেন না
GROUP_CONCAT
. এটি জটিল প্রশ্নগুলির সাথে সাহায্য করতে পারে।
GO TO FULL VERSION