আমি কীভাবে মাইএসকিউএল টেবিলগুলিতে সূচকগুলি যুক্ত করব?


407

আমি প্রায় 150,000 সারি ডেটা সহ একটি বিশাল মাইএসকিউএল টেবিল পেয়েছি। বর্তমানে, যখন আমি চেষ্টা করে চালাচ্ছি

SELECT * FROM table WHERE id = '1';

আইডি ক্ষেত্রটি প্রাথমিক সূচক হিসাবে কোডটি সূক্ষ্মভাবে চলে। তবে, প্রকল্পটির সাম্প্রতিক উন্নয়নের জন্য, আমাকে অন্য ক্ষেত্রের মাধ্যমে ডাটাবেসটি অনুসন্ধান করতে হবে। উদাহরণ স্বরূপ:

SELECT * FROM table WHERE product_id = '1';

এই ক্ষেত্রটি আগে সূচিযুক্ত ছিল না; যাইহোক, আমি একটি যুক্ত করেছি, সুতরাং মাইএসকিএল এখন ক্ষেত্রকে সূচক করে তোলে, তবে যখন আমি উপরের ক্যোয়ারীটি চালানোর চেষ্টা করি তখন এটি খুব ধীরে ধীরে চলে। একটি স্পষ্ট জিজ্ঞাসা প্রকাশ করে যে আমি যখন ইতোমধ্যে একটি যুক্ত করেছি তখন product_id ক্ষেত্রের জন্য কোনও সূচক নেই এবং ফলস্বরূপ কোয়েরিতে কোনও একক সারিতে ফিরে আসতে 20 মিনিট থেকে 30 মিনিটের সময় পর্যন্ত যে কোনও জায়গায় নেওয়া হয়।

আমার পূর্ণ বিবরণ ফলাফলগুলি:

| id | select_type | table | type | possible_keys| key  | key_len | ref  | rows  | Extra       |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
|  1 | SIMPLE      | table | ALL  | NULL         | NULL | NULL    | NULL |157211 | Using where |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+

এটি উল্লেখ করা সহায়ক হতে পারে যে আমি সবেমাত্র একবার দেখেছি এবং আইডি ফিল্ড INT হিসাবে সংরক্ষণ করা হয়েছে যেখানে PRODUCT_ID ক্ষেত্রটি VARCHAR হিসাবে সংরক্ষণ করা হয়েছে। এটি কি সমস্যার উত্স হতে পারে?


1
আপনি সম্পূর্ণ EXPLAINফলাফল পোস্ট করতে পারেন ? আপনি কি নিশ্চিত যে এটি কোনও সূচক নেই? বা সেখানে সূচকটি রয়েছে, তবে মাইএসকিউএল এটি ব্যবহার না করে বেছে নিচ্ছে?
ভোটে ডিসিপল

169
একটি বড় টেবিলের 150,000,000 রেকর্ড থাকবে। একটি খুব বড় টেবিলের 15,000,000,000 রেকর্ড রয়েছে। গড় আকারের একটি সারণীতে 150,000 রয়েছে ,000 ভবিষ্যতের রেফারেন্সের জন্য।
usumoio

4
সচেতন থাকুন যে 'OR' মাইএসকিউএলকে সূচকগুলি না ব্যবহার করতে পারে। 3 বা এর সাথে আমার একটি প্রশ্ন ছিল। প্রত্যেকে একটি সূচক তৈরি করে এবং 15 মিমি দৌড়ে, সব মিলিয়ে 25 সেকেন্ড এবং সময়সীমা শেষ করে। সুতরাং আমি 3 টি অনুসন্ধান করেছি এবং ইউনিয়ন তাদের একসাথে করেছি, এটি 500.000 সারিতে 15 মিমিও নিয়েছে।
লিফ নেল্যান্ড

আপনি যে ডেটা সংরক্ষণ করছেন তা বিবেচনা করুন। আপনি যে তুলনা করছেন তার ডেটা টাইপের ভিত্তিতে পারফরম্যান্স পরিবর্তন হতে পারে। যেমন আপনি বলেছিলেন যে PRODUCT_ID একটি VARCHAR ডেটা টাইপ, এটি একটি INT এ পরিবর্তন করে কলামটি সূচী করার চেষ্টা করুন।
gilbertdim

উত্তর:


606
ALTER TABLE `table` ADD INDEX `product_id_index` (`product_id`)

মাইএসকিউএলে কখনও তুলনা integerকরবেন stringsনা। যদি idহয় intতবে উদ্ধৃতিগুলি সরান।


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

1
একটি শো তৈরি টেবিল দিয়ে সূচকটি পরীক্ষা করে দেখবেন, বা আপনি ইতিমধ্যে এটি সম্পন্ন করেছেন?
রিক্কেন

33
SHOW INDEXES FROM YOURTABLE সূচকগুলি যুক্ত হয়েছে কিনা তা পরীক্ষা করতে dev.mysql.com/doc/refman/5.0/en/show-index.html ব্যবহার করুন
টিমো হুভিনেন

6
আজকে আমার ঠিক সমস্যাটি ছিল মিশেল বর্ণনা করেছেন এবং এর সমাধানটি ছিল "কখনই পূর্ণসংখ্যার সাথে মাইএসকিএল এর সাথে স্ট্রিংয়ের তুলনা না করা"। ধন্যবাদ.
ব্যবহারকারী 12345

@ ব্রিকেন আমি আমার সূচকটি যুক্ত করেছি এবং আপনার কমান্ডটি আপনার নিজের থেকে সূচকগুলি দেখি। এটি প্রদর্শিত হয় তবে আমি আমার টেবিলটি জিজ্ঞাসা করার সময় এটি ব্যবহার করা হয় বলে মনে করি না। কোন সূচক ব্যবহার করার সময় আমাকে কি নির্বাচিত ক্যোয়ারী পরিবর্তন করতে হবে?
সিড

147
ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME);

96
মাইএসকিউএল, আপনি ব্যবহার করেন ALTER TABLE tbl ADD INDEX (col)পরিবর্তে ALTER TABLE tbl ADD INDEX col (col), তারপর ব্যবহার ALTER TABLE tbl ADD INDEX (col)একাধিকবার নামে সূচকের যোগ রাখা হবে col_2, col_3... প্রতিটি সময়। ALTER TABLE tbl ADD INDEX col (col)2 য় বার ব্যবহার করার সময়, দিতে হবে ERROR 1061 (42000): Duplicate key name 'col'
অভিষেক ওজা

82

আপনি একটি সূচক যুক্ত করতে এবং সূচকের ধরণের (HASH বা BTREE) নিয়ন্ত্রণ করতে এই বাক্য গঠনটি ব্যবহার করতে পারেন।

create index your_index_name on your_table_name(your_column_name) using HASH;
or
create index your_index_name on your_table_name(your_column_name) using BTREE;

আপনি এখানে বিটিআরইআর এবং হ্যাশ সূচকগুলির মধ্যে পার্থক্য সম্পর্কে শিখতে পারেন: http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html


1
যখন আমি শো সূচকগুলি ব্যবহার করতে দেখি তখন হ্যাশ বিটিরিতে রূপান্তরিত হয়।
আরএন কুশওয়াহা

1
হ্যাশ এবং বিটি্রি থেকে ডিফল্ট কী হবে, যদি আমি কোনও উল্লেখ না করি?
ভাভুক মাথুর

2
@ আরএনকুশওয়াহার কারণ ইনোডিবি এবং মাই আইসাম HASH, আফাইককে সমর্থন করে না, কেবল মেমরি এবং এনডিবি স্টোরেজ ইঞ্জিনগুলি এটি সমর্থন করে
হিও ভিও

60

এটি লক্ষণীয় যে একাধিক ক্ষেত্র সূচকগুলি আপনার ক্যোয়ারের কার্য সম্পাদনকে মারাত্মকভাবে উন্নত করতে পারে। সুতরাং উপরের উদাহরণে আমরা ধরে নিই যে প্রোডাক্টআইডিই কেবল দেখার ক্ষেত্র তবে প্রোডাক্টআইডি = 1 এবং বিভাগ = 7 বলার ক্যোয়ারী তখন একাধিক কলাম সূচী সহায়তা করে। এটি নিম্নলিখিত দ্বারা অর্জন করা হয়:

ALTER TABLE `table` ADD INDEX `index_name` (`col1`,`col2`)

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


1
সুন্দর, সূচককে স্পষ্টভাবে নামকরণ করা সহজ বিপরীতে আসতে দেয়।
স্যাম বেরি

আপনি কি উত্স উদ্ধৃত করতে পারেন the index should match the order of the query fields?
বিশ্ব মিশ্র

58

দুটি প্রকারের সূচকগুলি যুক্ত করা যেতে পারে: আপনি যখন একটি প্রাথমিক কী সংজ্ঞায়িত করেন, তখন মাইএসকিউএল এটিকে ডিফল্ট অনুসারে সূচি হিসাবে গ্রহণ করবে।

ব্যাখ্যা

সূচক হিসাবে প্রাথমিক কী

আপনার একটি tbl_studentটেবিল রয়েছে তা বিবেচনা করুন এবং আপনি student_idপ্রাথমিক কী হিসাবে চান :

ALTER TABLE `tbl_student` ADD PRIMARY KEY (`student_id`)

উপরের বিবৃতিতে একটি প্রাথমিক কী যুক্ত করা হয়েছে যার অর্থ সূচকের মানগুলি অনন্য হতে হবে এবং নাল হতে পারে না।

সূচকের নাম উল্লেখ করুন

ALTER TABLE `tbl_student` ADD INDEX student_index (`student_id`)

উপরের বিবৃতি student_indexনামের সাথে একটি সাধারণ সূচক তৈরি করবে ।

অনন্য সূচক তৈরি করুন

ALTER TABLE `tbl_student` ADD UNIQUE student_unique_index (`student_id`)

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

ফুলটেক্সট বিকল্প

ALTER TABLE `tbl_student` ADD FULLTEXT student_fulltext_index (`student_id`)

উপরের বিবৃতিটি ফুলটেক্সট সূচকের নামটি তৈরি করবে student_fulltext_indexযার জন্য আপনার মাইএসএএম মাইএসকিএল ইঞ্জিন প্রয়োজন।

কীভাবে সূচকগুলি মুছে ফেলবেন?

DROP INDEX `student_index` ON `tbl_student`

উপলব্ধ সূচীগুলি কীভাবে চেক করবেন?

SHOW INDEX FROM `tbl_student`

17

আপনি বলেন যে আপনার একটি সূচক আছে, ব্যাখ্যা অন্যথায় বলে says তবে, আপনি যদি সত্যিই এটি করেন তবে এভাবে চালিয়ে যেতে হবে:

যদি কলামটিতে আপনার একটি সূচক থাকে এবং মাইএসকিউএল এটি ব্যবহার না করার সিদ্ধান্ত নেয়, কারণ এটি হতে পারে:

  1. মাইএসকিউএল কোয়েরিতে আরও একটি সূচক রয়েছে যা ব্যবহারের জন্য উপযুক্ত বলে মনে হয় এবং এটি কেবল একটিটি ব্যবহার করতে পারে। সমাধানটি সাধারণত একাধিক কলাম বিস্তৃত একটি সূচক হয় যদি তাদের পুনরুদ্ধারের স্বাভাবিক পদ্ধতিটি একাধিক কলামের মান অনুসারে হয়।
  2. মাইএসকিউএল সিদ্ধান্ত নিয়েছে যে অনেকগুলি সারি সারি রয়েছে এবং তারা মনে করে যে কোনও টেবিলস্ক্যানটি আরও দ্রুত। যদি এটি না হয়, কখনও কখনও একটি ANALYZE TABLEসহায়তা করে।
  3. আরও জটিল প্রশ্নগুলিতে, কোয়েরি-পরিকল্পনায় এটি অত্যন্ত বুদ্ধিমান চিন্তাভাবনা ভুডোর উপর ভিত্তি করে এটি ব্যবহার না করার সিদ্ধান্ত নিয়েছে যে কোনও কারণে কেবল আপনার বর্তমান প্রয়োজনীয়তার সাথে খাপ খায় না।

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

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