আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা কেবলমাত্র সমতাতে নির্বাচন করবে এবং আমি অনুভব করি যে আমার একটি বিটি্রি সূচকের চেয়ে একটি হ্যাশ সূচক ব্যবহার করা উচিত। আমার হতাশার অনেক কিছুই হ্যাশ সূচকগুলি মাইআইএসএএম বা ইনোডিবিতে সমর্থিত নয়। কি হয়েছে?
আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা কেবলমাত্র সমতাতে নির্বাচন করবে এবং আমি অনুভব করি যে আমার একটি বিটি্রি সূচকের চেয়ে একটি হ্যাশ সূচক ব্যবহার করা উচিত। আমার হতাশার অনেক কিছুই হ্যাশ সূচকগুলি মাইআইএসএএম বা ইনোডিবিতে সমর্থিত নয়। কি হয়েছে?
উত্তর:
অনেক উপাত্ত হ্যাশ ভিত্তিক সূচী সমর্থন করি না এ সব ।
হ্যাশ টেবিলটি দক্ষ হওয়ার জন্য আপনাকে যে সারিগুলির উপস্থিতি সম্ভবত রয়েছে তা জানতে হবে অন্যথায় বেস হ্যাশ টেবিলটি অনেক বড় হবে (অনেকগুলি খালি এন্ট্রি, স্থান এবং সম্ভাব্য ডিস্ক আইও) নষ্ট হবে বা এর অর্থ খুব ছোট হবে নির্দেশনা প্রায়শই ব্যবহৃত হয় (সম্ভবত একাধিক স্তরের দিকনির্দেশনা, বা আরও খারাপ যদি হ্যাশ বাস্তবায়ন একক স্তরের হয় তবে আপনি ন্যায্য সংখ্যক রেকর্ডের উপর রৈখিক অনুসন্ধান চালিয়ে যেতে পারেন) যে সময়ে জিনিসগুলি সম্ভবত আর দক্ষ নয় তবে গাছ ভিত্তিক যাইহোক সূচক।
সুতরাং সাধারণভাবে দরকারী হয়ে উঠতে (অর্থাত্ বিকল্পের চেয়ে সাধারণত ভাল) সূচিটি মাঝে মধ্যে পুনর্নির্মাণ করা প্রয়োজন যেমন ডেটা বৃদ্ধি পায় (এবং সঙ্কুচিত হয়) যা একটি বিরতিপূর্ণ ওভারহেড যুক্ত করতে পারে। এটি সাধারণত মেমরি ভিত্তিক টেবিলগুলির সাথে ঠিক থাকে কারণ পুনর্নির্মাণটি সম্ভবত খুব দ্রুত হতে চলেছে (যেহেতু ডেটা সর্বদা র্যামে চলেছে এবং কোনও ক্ষেত্রে এটি বৃহত্তর হওয়ার সম্ভাবনা নেই) তবে ডিস্কে একটি বৃহত সূচী পুনর্নির্মাণ হ'ল খুব ভারী অপারেশন (এবং আইআইআরসি মাইএসকিউএল লাইভ ইনডেক্স পুনর্নির্মাণকে সমর্থন করে না যাতে অপারেশনের সময় একটি টেবিল লক থাকে)।
সুতরাং হ্যাশ সূচকগুলি মেমরি টেবিলগুলিতে ব্যবহৃত হয় কারণ তারা সাধারণত আরও ভাল পারফর্মার থাকে তবে ডিস্ক ভিত্তিক টেবিলগুলি তাদের সমর্থন করে না কারণ তারা পারফরম্যান্সের ক্ষতি হতে পারে না বোনাস। স্টপ হ্যাশ ইনডেক্স কিছুই অবশ্যই ডিস্ক ভিত্তিক টেবিলের জন্য উপলব্ধ করা হচ্ছে নেই, কোন সন্দেহ নেই কিছু ডাটাবেস না বৈশিষ্ট্য সমর্থন কিন্তু সম্ভবতঃ তারা ISAM বাস্তবায়িত হয় না / রক্ষণাবেক্ষণকারীকে যেমন InnoDB টেবিল বৈশিষ্ট্য মূল্য যোগ (যেমন বিবেচনা করা হয় না লিখতে এবং বজায় রাখার জন্য অতিরিক্ত কোড সেই কয়েকটি পরিস্থিতিতে উপকারের পক্ষে মূল্যবান নয় যে এটি একটি তাত্পর্যপূর্ণ পার্থক্য করে)। সম্ভবত আপনি যদি দৃ strongly়ভাবে একমত নন তবে আপনি তাদের সাথে কথা বলতে পারেন এবং বৈশিষ্ট্যটি বাস্তবায়নের জন্য একটি ভাল কেস তৈরি করতে পারেন।
যদি আপনি বড় স্ট্রিংগুলি সূচক করে থাকেন তবে নিজের সিউডো-হ্যাশ সূচকটি প্রয়োগ করুন (মানটির একটি হ্যাশ পাশাপাশি প্রকৃত মান সংরক্ষণ করে এবং কলামযুক্ত সূচীকরণ) কাজ করতে পারে তবে বৃহত্তর স্ট্রিংগুলির ক্ষেত্রে এটি অবশ্যই আরও কার্যকর where হ্যাশ মানটি গণনা করা এবং এই মান দ্বারা ট্রি সূচক অনুসন্ধান করা সবসময় দ্রুত হওয়ার সম্ভাবনা থাকে তবে কেবল তুলনামূলকভাবে বৃহত্তর মান ব্যবহার করে একটি ট্রি সূচক অনুসন্ধান করা এবং অতিরিক্ত ব্যবহৃত স্টোরেজ উল্লেখযোগ্য হবে না) সুতরাং বাস্তবায়নের আগে কিছু কার্যকারিতা বিশ্লেষণ করুন এই উত্পাদন।
সম্পর্কিত নোটে, আপনি পোস্টগ্রেএসকিউএল ডক্স থেকে সূচক প্রকারের আলোচনাটি আকর্ষণীয় খুঁজে পেতে পারেন। এটি ডক্সের সাম্প্রতিক সংস্করণগুলিতে আর উপস্থিত নেই (পরবর্তী অনুকূলিতকরণের কারণে, আমি এটি নিই), তবে গ্রহণটি মাইএসকিউএলের জন্য একইরকম হতে পারে (এবং কেন হ্যাশ সূচীগুলি কেবল হিপ টেবিলের জন্য ব্যবহৃত হয়):
http://www.postgresql.org/docs/8.1/static/indexes-types.html
দ্রষ্টব্য: পরীক্ষাগুলি বি-ট্রি সূচকগুলির চেয়ে ভাল কোনও সম্পাদন করতে পোস্টগ্র্রেএসকিউএল এর হ্যাশ সূচকগুলি দেখিয়েছে, এবং হ্যাশ সূচকগুলির জন্য সূচির আকার এবং বিল্ড সময় আরও খারাপ। তদতিরিক্ত, হ্যাশ সূচক ক্রিয়াকলাপগুলি বর্তমানে ওয়াল-লগ নেই, সুতরাং একটি ডাটাবেস ক্র্যাশ হওয়ার পরে হ্যাশ সূচীগুলি পুনরায় তৈরি করা দরকার। এই কারণে, হ্যাশ সূচক ব্যবহার বর্তমানে নিরুৎসাহিত করা হয়। একইভাবে, জি-জিএসটি সূচকগুলির সমতুল্য ক্রিয়াকলাপের তুলনায় আর-ট্রি সূচকগুলিতে কোনও কার্যকারিতা সুবিধা রয়েছে বলে মনে হয় না। হ্যাশ সূচকগুলির মতো এগুলিও ওয়াল-লগ নেই এবং ডাটাবেস ক্রাশের পরে পুনরায় সূচি প্রয়োজন হতে পারে। হ্যাশ সূচকগুলির সমস্যাগুলি শেষ পর্যন্ত সংশোধন করা যেতে পারে, তবে সম্ভবত এটি সম্ভব যে আর-ট্রি সূচক প্রকার ভবিষ্যতে প্রকাশিত হবে। জিআইএসটি সূচকগুলিতে আর-ট্রি সূচকগুলি ব্যবহার করে এমন অ্যাপ্লিকেশনগুলি স্থানান্তর করতে ব্যবহারকারীদের উত্সাহ দেওয়া হচ্ছে।
আবার এটি পোস্টগ্র্রেএসকিউএল-নির্দিষ্ট (এর অপ্রচলিত সংস্করণ), তবে এটি ইঙ্গিত করা উচিত যে "প্রাকৃতিক" সূচক প্রকারটি অপরিহার্যভাবে সর্বোত্তম কর্মক্ষমতা অর্জন করবে না।
এখানে আকর্ষণীয় কিছু:
মাইএসকিউএল 5.0 শংসাপত্রের স্টাডি গাইড বই অনুসারে পৃষ্ঠা 433, বিভাগ 29.5.1
মেমোরি ইঞ্জিন ডিফল্ট ইনডেক্সিং অ্যালগরিদম দ্বারা HASH ব্যবহার করে।
হাসির জন্য, আমি মাইএসকিউএল 5.5.12 এ হ্যাশ ব্যবহার করে একটি প্রাথমিক কী সহ একটি ইনোডিবি টেবিল এবং একটি মাইএসএএম টেবিল তৈরি করার চেষ্টা করেছি
mysql> use test
Database changed
mysql> create table rolando (num int not null, primary key (num) using hash);
Query OK, 0 rows affected (0.11 sec)
mysql> show create table rolando\G
*************************** 1. row ***************************
Table: rolando
Create Table: CREATE TABLE `rolando` (
`num` int(11) NOT NULL,
PRIMARY KEY (`num`) USING HASH
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> create table rolando2 (num int not null, primary key (num) using hash) engine=MyISAM;
Query OK, 0 rows affected (0.05 sec)
mysql> show create table rolando2\G
*************************** 1. row ***************************
Table: rolando2
Create Table: CREATE TABLE `rolando2` (
`num` int(11) NOT NULL,
PRIMARY KEY (`num`) USING HASH
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
মাইএসকিউএল অভিযোগ করেনি।
হালনাগাদ
খারাপ সংবাদ !!! আমি শো থেকে সূচকগুলি ব্যবহার করেছি। এটি সূচকটি বিটিআরই বলে।
তৈরি করুন এর INDEX সিনট্যাক্স মাইএসকিউএল পৃষ্ঠা যে শুধুমাত্র মেমরি এবং NDB স্টোরেজ ইঞ্জিন হ্যাশ এর INDEX ধরানো যায়।
mysql> show indexes from rolando;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| rolando | 0 | PRIMARY | 1 | num | A | 0 | NULL | NULL | | BTREE | | |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
mysql> show indexes from rolando2;
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| rolando2 | 0 | PRIMARY | 1 | num | A | 0 | NULL | NULL | | BTREE | | |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
mysql> create table rolando3 (num int not null, primary key (num)) ENGINE=MEMORY;
Query OK, 0 rows affected (0.03 sec)
mysql> show create table rolando3\G
*************************** 1. row ***************************
Table: rolando3
Create Table: CREATE TABLE `rolando3` (
`num` int(11) NOT NULL,
PRIMARY KEY (`num`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> show indexes from rolando3;
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| rolando3 | 0 | PRIMARY | 1 | num | NULL | 0 | NULL | NULL | | HASH | | |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
কিছু লোক হ্যাশ অ্যালগরিদম অনুকরণ করতে " হাই পারফরম্যান্স মাইএসকিউএল: অপটিমাইজেশন, ব্যাকআপস, রেপ্লিকেশন এবং আরও " বইয়ের পৃষ্ঠাগুলি 102-105 এ ধারণা অনুসরণ করার পরামর্শ দিয়েছিল ।
পৃষ্ঠা 105 এ আমার কাছে পছন্দ হওয়া এই দ্রুত এবং নোংরা অ্যালগরিদম বৈশিষ্ট্যযুক্ত:
SELECT CONV(RIGHT(MD5('whatever value you want'),16),16,10) AS HASH64;
যে কোনও সারণীতে এর জন্য একটি কলাম তৈরি করুন এবং এই মানটিকে সূচক করুন।
একবার চেষ্টা করে দেখো !!!
বিটি ট্রি একক সারি দেখার জন্য হ্যাশের চেয়ে খুব ধীর নয়। যেহেতু বিটি্রি খুব দক্ষ পরিসীমা প্রশ্ন সরবরাহ করে, তাই কেন বিটি্রি ব্যতীত অন্য যে কোনও বিষয় নিয়ে বিরক্ত করুন।
মাইএসকিউএল বিটি্রি ব্লকগুলি ক্যাশে করার জন্য খুব ভাল কাজ করে, সুতরাং একটি বিটি্রি-ভিত্তিক ক্যোয়ারিতে খুব কমই I / O করতে হয় যা কোনও প্রশ্নের সবচেয়ে বড় সময় গ্রাহক।