মাইএসকিউএল এর মাইআইএসএএম বা ইনোডিবিতে হ্যাশ সূচকগুলি নেই কেন?


35

আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা কেবলমাত্র সমতাতে নির্বাচন করবে এবং আমি অনুভব করি যে আমার একটি বিটি্রি সূচকের চেয়ে একটি হ্যাশ সূচক ব্যবহার করা উচিত। আমার হতাশার অনেক কিছুই হ্যাশ সূচকগুলি মাইআইএসএএম বা ইনোডিবিতে সমর্থিত নয়। কি হয়েছে?


2
মাইএসকিএল ফাংশন-ভিত্তিক সূচকগুলি, বিটম্যাপ সূচকগুলি ইত্যাদিকে সমর্থন করে না কারণ এটি

1
আমি ঠিক বুঝতে পেরেছি যে হ্যাশ সূচীগুলি এতটাই ... মৌলিক ... আমি ধরে নিয়েছি বাস্তবায়ন সম্পর্কিত নির্দিষ্ট কারণ রয়েছে।

1
@ অ্যালেক্স: আমি বাজি ধরেছি যে কারণটি "আলস্যতা" এবং "আমলাতন্ত্র" তবে আসুন উত্তরের জন্য অপেক্ষা করুন))


আমি আমার উত্তরের শেষে হাই পারফরম্যান্স মাইএসকিউএল বুক থেকে একটি দুর্দান্ত হ্যাশ আলগোরিদিম যুক্ত করেছি।
রোল্যান্ডোমাইএসকিউএলডিবিএ

উত্তর:


16

অনেক উপাত্ত হ্যাশ ভিত্তিক সূচী সমর্থন করি না এ সব

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

সুতরাং সাধারণভাবে দরকারী হয়ে উঠতে (অর্থাত্ বিকল্পের চেয়ে সাধারণত ভাল) সূচিটি মাঝে মধ্যে পুনর্নির্মাণ করা প্রয়োজন যেমন ডেটা বৃদ্ধি পায় (এবং সঙ্কুচিত হয়) যা একটি বিরতিপূর্ণ ওভারহেড যুক্ত করতে পারে। এটি সাধারণত মেমরি ভিত্তিক টেবিলগুলির সাথে ঠিক থাকে কারণ পুনর্নির্মাণটি সম্ভবত খুব দ্রুত হতে চলেছে (যেহেতু ডেটা সর্বদা র‍্যামে চলেছে এবং কোনও ক্ষেত্রে এটি বৃহত্তর হওয়ার সম্ভাবনা নেই) তবে ডিস্কে একটি বৃহত সূচী পুনর্নির্মাণ হ'ল খুব ভারী অপারেশন (এবং আইআইআরসি মাইএসকিউএল লাইভ ইনডেক্স পুনর্নির্মাণকে সমর্থন করে না যাতে অপারেশনের সময় একটি টেবিল লক থাকে)।

সুতরাং হ্যাশ সূচকগুলি মেমরি টেবিলগুলিতে ব্যবহৃত হয় কারণ তারা সাধারণত আরও ভাল পারফর্মার থাকে তবে ডিস্ক ভিত্তিক টেবিলগুলি তাদের সমর্থন করে না কারণ তারা পারফরম্যান্সের ক্ষতি হতে পারে না বোনাস। স্টপ হ্যাশ ইনডেক্স কিছুই অবশ্যই ডিস্ক ভিত্তিক টেবিলের জন্য উপলব্ধ করা হচ্ছে নেই, কোন সন্দেহ নেই কিছু ডাটাবেস না বৈশিষ্ট্য সমর্থন কিন্তু সম্ভবতঃ তারা ISAM বাস্তবায়িত হয় না / রক্ষণাবেক্ষণকারীকে যেমন InnoDB টেবিল বৈশিষ্ট্য মূল্য যোগ (যেমন বিবেচনা করা হয় না লিখতে এবং বজায় রাখার জন্য অতিরিক্ত কোড সেই কয়েকটি পরিস্থিতিতে উপকারের পক্ষে মূল্যবান নয় যে এটি একটি তাত্পর্যপূর্ণ পার্থক্য করে)। সম্ভবত আপনি যদি দৃ strongly়ভাবে একমত নন তবে আপনি তাদের সাথে কথা বলতে পারেন এবং বৈশিষ্ট্যটি বাস্তবায়নের জন্য একটি ভাল কেস তৈরি করতে পারেন।

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


পুরো টেবিলটি লক না করে পাশাপাশি পুনরায় হ্যাশিং (পুনর্নির্মাণ) করার কোনও উপায় আছে কি?
পেসারিয়ার

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

সাধারণত ডেটা দৈর্ঘ্য দ্বিগুণ হলেই পুনর্নির্মাণের প্রয়োজন হয়। প্রতি মিনিটে ডেটা দৈর্ঘ্য দ্বিগুণ হওয়ার বিষয়ে তাদের কী সত্যিই চিন্তা করতে হবে? (সাধারণত এটি খুব কমই ঘটে যখন ডাটাবেসটি উদ্বেগের জন্য যথেষ্ট বড় হয়)
সাফ

6

সম্পর্কিত নোটে, আপনি পোস্টগ্রেএসকিউএল ডক্স থেকে সূচক প্রকারের আলোচনাটি আকর্ষণীয় খুঁজে পেতে পারেন। এটি ডক্সের সাম্প্রতিক সংস্করণগুলিতে আর উপস্থিত নেই (পরবর্তী অনুকূলিতকরণের কারণে, আমি এটি নিই), তবে গ্রহণটি মাইএসকিউএলের জন্য একইরকম হতে পারে (এবং কেন হ্যাশ সূচীগুলি কেবল হিপ টেবিলের জন্য ব্যবহৃত হয়):

http://www.postgresql.org/docs/8.1/static/indexes-types.html

দ্রষ্টব্য: পরীক্ষাগুলি বি-ট্রি সূচকগুলির চেয়ে ভাল কোনও সম্পাদন করতে পোস্টগ্র্রেএসকিউএল এর হ্যাশ সূচকগুলি দেখিয়েছে, এবং হ্যাশ সূচকগুলির জন্য সূচির আকার এবং বিল্ড সময় আরও খারাপ। তদতিরিক্ত, হ্যাশ সূচক ক্রিয়াকলাপগুলি বর্তমানে ওয়াল-লগ নেই, সুতরাং একটি ডাটাবেস ক্র্যাশ হওয়ার পরে হ্যাশ সূচীগুলি পুনরায় তৈরি করা দরকার। এই কারণে, হ্যাশ সূচক ব্যবহার বর্তমানে নিরুৎসাহিত করা হয়। একইভাবে, জি-জিএসটি সূচকগুলির সমতুল্য ক্রিয়াকলাপের তুলনায় আর-ট্রি সূচকগুলিতে কোনও কার্যকারিতা সুবিধা রয়েছে বলে মনে হয় না। হ্যাশ সূচকগুলির মতো এগুলিও ওয়াল-লগ নেই এবং ডাটাবেস ক্রাশের পরে পুনরায় সূচি প্রয়োজন হতে পারে। হ্যাশ সূচকগুলির সমস্যাগুলি শেষ পর্যন্ত সংশোধন করা যেতে পারে, তবে সম্ভবত এটি সম্ভব যে আর-ট্রি সূচক প্রকার ভবিষ্যতে প্রকাশিত হবে। জিআইএসটি সূচকগুলিতে আর-ট্রি সূচকগুলি ব্যবহার করে এমন অ্যাপ্লিকেশনগুলি স্থানান্তর করতে ব্যবহারকারীদের উত্সাহ দেওয়া হচ্ছে।

আবার এটি পোস্টগ্র্রেএসকিউএল-নির্দিষ্ট (এর অপ্রচলিত সংস্করণ), তবে এটি ইঙ্গিত করা উচিত যে "প্রাকৃতিক" সূচক প্রকারটি অপরিহার্যভাবে সর্বোত্তম কর্মক্ষমতা অর্জন করবে না।


5

এখানে আকর্ষণীয় কিছু:

মাইএসকিউএল 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;

যে কোনও সারণীতে এর জন্য একটি কলাম তৈরি করুন এবং এই মানটিকে সূচক করুন।

একবার চেষ্টা করে দেখো !!!


5
উত্পাদনে সিউডো-হ্যাশ-সূচক কৌশলটি ব্যবহার করার আগে এটি সম্পর্কে কিছু কার্যকারিতা বিশ্লেষণ করুন। বড় স্ট্রিংয়ের ক্ষেত্রে এটি একটি বড় পার্থক্য আনতে পারে তবে আপনি শেষ পর্যন্ত যে কোনও উপায়ে একটি ট্রি ইনডেক্স নেভিগেট করে শেষ করেন এবং হ্যাশটির সাথে মিলে যাওয়াগুলি থেকে সঠিক সারিটি খুঁজে পেতে আপনার অতিরিক্ত তুলনা করতে হবে, তাই হ্যাশ মানগুলিকে গণনা করা ছোট মানগুলির জন্য এবং এগুলি সংরক্ষণের পক্ষে এটি উপযুক্ত নয়। এটি মোটেও হ্যাশ সূচক নয়, আপনি কেবল গাছের উপর দিয়ে চলার কাজটি হ্রাস করছেন (প্রতিটি তুলনামূলকভাবে কম বাইট বিবেচনা করা হচ্ছে, উদাহরণস্বরূপ x00 বাইট স্ট্রিংয়ের পরিবর্তে 8 বাইট আইএনটি তুলনা করা)।
ডেভিড স্পিললেট

@ ডেভিড স্পিলিট এটিতে, আমি আপনার সাথে পুরোপুরি একমত হতে চাই। অন্যান্য সূচকের স্তরগুলি একই অধ্যায়ে 11 অধ্যায়ে "উচ্চ পারফরম্যান্সের জন্য সূচক কৌশলগুলি" তেও পরামর্শ দেওয়া হয়েছে। আমার উত্তরের অতিরিক্ত উত্সাহ হিসাবে বইটি আসলে একটি ক্লাস্টারড ইনডেক্স ব্যবহার করে উল্লেখ করেছে যা একই কাঠামোতে সারি এবং বিটি্রি সূচক সংরক্ষণ করে। এটি আপনার উল্লেখ করা হ্রাস কাজের গতি বাড়িয়ে দিতে পারে। দুর্ভাগ্যক্রমে, আপনি যে হুপগুলি কেবলমাত্র উল্লিখিত করেছেন তার মধ্যে দিয়ে কিছুটা অনিবার্য। আপনার মন্তব্যে আমার থেকে একটি +1 তবুও স্যার !!! আসলে, আপনার উত্তরের জন্যও +1।
রোল্যান্ডোমাইএসকিউএলডিবিএ

@ রোল্যান্ডোমাইএসকিউএলডিবিএ আপনি "কাস্টম হ্যাশিং" এর অংশটি আরও বিস্তারিতভাবে বর্ণনা করতে পারেন, শেষ অনুচ্ছেদে তেমন কোনও ক্লু দেবে বলে মনে হচ্ছে না ...
পেসারিয়ার

2

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

মাইএসকিউএল বিটি্রি ব্লকগুলি ক্যাশে করার জন্য খুব ভাল কাজ করে, সুতরাং একটি বিটি্রি-ভিত্তিক ক্যোয়ারিতে খুব কমই I / O করতে হয় যা কোনও প্রশ্নের সবচেয়ে বড় সময় গ্রাহক।

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