আমি কখন যৌগিক সূচক ব্যবহার করব?


133
  1. আমি কখন একটি ডেটাবেসে একটি যৌগিক সূচক ব্যবহার করব?
  2. যৌগিক সূচক ব্যবহার করে পারফরম্যান্স র‌্যামিফিকেশন কী কী)?
  3. আমি কেন একটি যৌগিক সূচক ব্যবহার করব?

উদাহরণস্বরূপ, আমার একটি homesটেবিল রয়েছে:

CREATE TABLE IF NOT EXISTS `homes` (
  `home_id` int(10) unsigned NOT NULL auto_increment,
  `sqft` smallint(5) unsigned NOT NULL,
  `year_built` smallint(5) unsigned NOT NULL,
  `geolat` decimal(10,6) default NULL,
  `geolng` decimal(10,6) default NULL,
  PRIMARY KEY  (`home_id`),
  KEY `geolat` (`geolat`),
  KEY `geolng` (`geolng`),
) ENGINE=InnoDB  ;

এটা কি ঠিক আমাকে উভয়ের জন্য একটি যৌগিক সূচক ব্যবহার করার জন্য geolatএবং geolng, এই ধরনের যে:

আমি প্রতিস্থাপন:

  KEY `geolat` (`geolat`),
  KEY `geolng` (`geolng`),

সঙ্গে:

KEY `geolat_geolng` (`geolat`, `geolng`)

যদি তাই:

  • কেন?
  • যৌগিক সূচক ব্যবহার করে পারফরম্যান্স র‌্যামিফিকেশন কী)?

হালনাগাদ:

যেহেতু অনেক লোক এটি সম্পূর্ণরূপে আমার সম্পাদিত প্রশ্নের উপর নির্ভর করে বলেছে, নীচে সর্বাধিক সাধারণ জিজ্ঞাসাটি করা হচ্ছে:

SELECT * FROM homes
WHERE geolat BETWEEN ??? AND ???
AND geolng BETWEEN ??? AND ???

আপডেট 2:

নিম্নলিখিত ডাটাবেস স্কিমা সহ:

CREATE TABLE IF NOT EXISTS `homes` (
  `home_id` int(10) unsigned NOT NULL auto_increment,
  `primary_photo_group_id` int(10) unsigned NOT NULL default '0',
  `customer_id` bigint(20) unsigned NOT NULL,
  `account_type_id` int(11) NOT NULL,
  `address` varchar(128) collate utf8_unicode_ci NOT NULL,
  `city` varchar(64) collate utf8_unicode_ci NOT NULL,
  `state` varchar(2) collate utf8_unicode_ci NOT NULL,
  `zip` mediumint(8) unsigned NOT NULL,
  `price` mediumint(8) unsigned NOT NULL,
  `sqft` smallint(5) unsigned NOT NULL,
  `year_built` smallint(5) unsigned NOT NULL,
  `num_of_beds` tinyint(3) unsigned NOT NULL,
  `num_of_baths` decimal(3,1) unsigned NOT NULL,
  `num_of_floors` tinyint(3) unsigned NOT NULL,
  `description` text collate utf8_unicode_ci,
  `geolat` decimal(10,6) default NULL,
  `geolng` decimal(10,6) default NULL,
  `display_status` tinyint(1) NOT NULL,
  `date_listed` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `contact_email` varchar(100) collate utf8_unicode_ci NOT NULL,
  `contact_phone_number` varchar(15) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`home_id`),
  KEY `customer_id` (`customer_id`),
  KEY `city` (`city`),
  KEY `num_of_beds` (`num_of_beds`),
  KEY `num_of_baths` (`num_of_baths`),
  KEY `geolat` (`geolat`),
  KEY `geolng` (`geolng`),
  KEY `account_type_id` (`account_type_id`),
  KEY `display_status` (`display_status`),
  KEY `sqft` (`sqft`),
  KEY `price` (`price`),
  KEY `primary_photo_group_id` (`primary_photo_group_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;

নিম্নলিখিত এসকিউএল ব্যবহার:

EXPLAIN SELECT  homes.home_id,
                    address,
                    city,
                    state,
                    zip,
                    price,
                    sqft,
                    year_built,
                    account_type_id,
                    num_of_beds,
                    num_of_baths,
                    geolat,
                    geolng,
                    photo_id,
                    photo_url_dir
            FROM homes
            LEFT OUTER JOIN home_photos ON homes.home_id = home_photos.home_id
                AND homes.primary_photo_group_id = home_photos.home_photo_group_id
                AND home_photos.home_photo_type_id = 2
            WHERE homes.display_status = true
            AND homes.geolat BETWEEN -100 AND 100
            AND homes.geolng BETWEEN -100 AND 100

ব্যাখ্যা ফিরে:

id  select_type  table        type  possible_keys                                    key                  key_len  ref     rows  Extra
----------------------------------------------------------------------------------------------------------
1   SIMPLE       homes        ref   geolat,geolng,display_status                     display_status       1        const   2     Using where
1  SIMPLE        home_photos  ref   home_id,home_photo_type_id,home_photo_group_id   home_photo_group_id  4        homes.primary_photo_group_id   4  

কীভাবে এক্সপ্ল্যান কমান্ডটি পড়তে হয় তা আমি পুরোপুরি বুঝতে পারি না। এটি কি ভাল বা খারাপ দেখাচ্ছে। এখনই, আমি জিওল্যাট এবং জিওলংয়ের জন্য একটি যৌগিক সূচক ব্যবহার করছি না। আমি কি হব?

উত্তর:


111

আপনি যখন এর থেকে উপকৃত প্রশ্নগুলি ব্যবহার করছেন তখন আপনার একটি যৌগিক সূচক ব্যবহার করা উচিত। এটির মতো দেখতে একটি যৌগিক সূচক:

index( column_A, column_B, column_C )

যোগদানের, ফিল্টারিং এবং কখনও কখনও নির্বাচনের জন্য fields ক্ষেত্রগুলি ব্যবহার করে এমন একটি ক্যোয়ারীতে উপকৃত হবে। এটি সেই সংস্থাগুলিতে কলামগুলির বাম-সর্বাধিক উপসেটগুলি ব্যবহার করে এমন প্রশ্নেরও উপকার করবে। সুতরাং উপরের সূচকটি প্রয়োজনীয় জিজ্ঞাসাও পূরণ করবে

index( column_A, column_B, column_C )
index( column_A, column_B )
index( column_A )

তবে এটি (কমপক্ষে সরাসরি নয়, সম্ভবত এটি আরও ভাল সূচক না থাকলে আংশিকভাবে সহায়তা করতে পারে) প্রয়োজন এমন প্রশ্নের জন্য সহায়তা করবে

index( column_A, column_C )

কীভাবে কলাম_বি অনুপস্থিত তা লক্ষ্য করুন।

আপনার আসল উদাহরণে, দুটি মাত্রার জন্য একটি সংমিশ্র সূচকটি বেশিরভাগই যে প্রশ্নগুলিকে উপকার করবে যা উভয় মাত্রা বা বাম দিকের মাত্রা নিজেই দ্বারা অনুসন্ধান করে তবে নিজেই সঠিকতম মাত্রা নয়। আপনি যদি সর্বদা দুটি মাত্রা জিজ্ঞাসা করেন তবে একটি যৌগিক সূচকটি হ'ল উপায়, আসলে কোনটি প্রথমে (খুব সম্ভবত) তা গুরুত্বপূর্ণ নয়।


1
চিহ্নিত করুন, আমি আমার মূল পোস্টটি আপডেট করেছি (আপডেট 2)। এটি আমার আসল প্রশ্ন। আমার আসল ডিবি স্কিমা। এক্সপ্ল্যান কমান্ড কী দেয়। সুতরাং, এই তথ্য সহ - আমি কি কোনও যৌগিক সূচক ব্যবহার করব। আমি এখনও অস্পষ্ট। আগাম ধন্যবাদ.
টেডি 3

চিহ্নিত করুন, আপনার উত্তরের যৌগিক সূচকগুলি কি সূচকটি পূরণ করে (কলাম_সি)?
বরিস ডি তেওহরভ

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

1
-1 কারণ একটি যৌগিক সূচক সাহায্য করে নাWHERE geolat BETWEEN ??? AND ??? AND geolng BETWEEN ??? AND ??? । এটি প্রথম মাঠের পরে থামবে। "প্রশ্ন ওভারফ্লো" থেকে উত্তর কেন তা ব্যাখ্যা করে।
রিক জেমস

1
@ ফিলিভিথ মাইএসকিউএল কেবলমাত্র একটি কোয়েরিতে প্রতিটি টেবিলের জন্য একটি করে সূচক ব্যবহার করতে পারে (ছাড়গুলি রয়েছে eg উদাহরণস্বরূপ, সূচকগুলি মার্জ করা)। যার আদর্শ অর্থ হ'ল কোয়েরিতে থাকা একটি সারণিকে অবশ্যই যেখানে ক্লজ, টেবিল জয়েন, গ্রুপ-বাই এবং অর্ডার বাই সকলের জন্য একটি একক সূচক ব্যবহার করতে হবে। সুতরাং প্রতিটি কলামে পৃথক সূচি সর্বদা কাজ না করে তবে একটি যৌগিক সূচক যাদু করতে পারে।
আখিল ম্যাথিউ

56

আপনার নিম্নলিখিত তিনটি প্রশ্ন রয়েছে তা কল্পনা করুন:

প্রশ্ন আমি:

SELECT * FROM homes WHERE `geolat`=42.9 AND `geolng`=36.4

প্রশ্ন দ্বিতীয়:

SELECT * FROM homes WHERE `geolat`=42.9

প্রশ্ন তৃতীয়:

SELECT * FROM homes WHERE `geolng`=36.4

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

উপর একাধিক কলাম ইনডেক্সে ম্যানুয়াল বিভাগে, এটা পরিষ্কারভাবে ব্যাখ্যা করা হয় কীভাবে একাধিক কলাম ইনডেক্স কাজ, তাই আমি ম্যানুয়াল আবার টাইপ করতে চান না।

থেকে মাইএসকিউএল রেফারেন্স ম্যানুয়াল পৃষ্ঠা :

একাধিক-কলাম সূচককে একটি সাজানো অ্যারে হিসাবে মান হিসাবে বিবেচনা করা যেতে পারে যা সূচকযুক্ত কলামগুলির মানকে একত্রিত করে তৈরি করা হয়

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

INDEX geolat
-----------
VALUE RRN
36.4  1
36.4  8
36.6  2
37.8  3
37.8  12
41.4  4

INDEX geolng
-----------
VALUE RRN
26.1  1
26.1  8
29.6  2
29.6  3
30.1  12
34.7  4

আপনি যদি যৌগিক সূচক ব্যবহার করেন তবে উভয় কলামের জন্য আপনার কাছে একটি সূচক রয়েছে:

INDEX (geolat, geolng)
-----------
VALUE      RRN
36.4,26.1  1
36.4,26.1  8
36.6,29.6  2
37.8,29.6  3
37.8,30.1  12
41.4,34.7  4

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

এছাড়াও, কীভাবে মাইএসকিউএল সূচি ম্যানুয়াল বিভাগ ব্যবহার করে তা দেখুন have


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

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

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

আমি বুঝতে পারছি না। কেন আমি geolat এবং geolng জন্য পৃথক ইনডেক্স ব্যবহার করা উচিত যখন আমি সবসময় একটি ক্যোয়ারী উভয় কলাম অন্তর্ভুক্ত সঞ্চালন করব
টেডি

1
নং যখন "রেঞ্জ" সম্মুখীন হয় (যেমন হিসাবে BETWEEN) তখন সূচকের আর কোনও ক্ষেত্র বিবেচনা করা হয় না! সুতরাং সম্মিলিত সূচক এর চেয়ে ভাল আর নয়।
রিক জেমস

19

সম্মিলিত সূচক কী করে সে সম্পর্কে একটি ভুল ধারণা থাকতে পারে। অনেক লোক মনে করে যে সম্মতিসূচক সূচীটি whereআপনার ক্ষেত্রে geolatএবং যখন অবধি সূচকযুক্ত কলামগুলিকে আবরণ করে ততক্ষণ কোনও অনুসন্ধান অনুসন্ধানকে অনুকূল করতে ব্যবহার করা যেতে পারে geolng। আসুন আরও গভীরভাবে আঁকুন:

আমি বিশ্বাস করি যে বাড়ির স্থানাঙ্কগুলিতে আপনার ডেটাগুলি এলোমেলো দশমিক হিসাবে হবে:

home_id  geolat  geolng
   1    20.1243  50.4521
   2    22.6456  51.1564
   3    13.5464  45.4562
   4    55.5642 166.5756
   5    24.2624  27.4564
   6    62.1564  24.2542
...

যেহেতু geolatএবং geolngমানগুলি খুব কমই নিজের পুনরাবৃত্তি করে। একটি যৌগিক সূচক geolatএবং এর geolngমতো দেখতে কিছু হবে:

index_id  geolat  geolng
   1     20.1243  50.4521
   2     20.1244  61.1564
   3     20.1251  55.4562
   4     20.1293  66.5756
   5     20.1302  57.4564
   6     20.1311  54.2542
...

সুতরাং যৌগিক সূচকের দ্বিতীয় কলামটি মূলত অকেজো ! একটি যৌগিক সূচক সহ আপনার প্রশ্নের গতি সম্ভবত geolatকলামের কোনও সূচকের সাথে একই রকম হতে চলেছে ।

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

ট্রেড অফটি হ'ল একটি স্থানিক বিন্দুটি অনেক বেশি মেমরি গ্রহণ করে কারণ এটি স্থানাঙ্কগুলি সংরক্ষণের জন্য আট-বাইট ডাবল-স্পষ্টতা নম্বর ব্যবহার করে। আমি ভুল হলে আমাকে সংশোধন করুন।


5

যৌগিক সূচীগুলি এগুলি হিসাবে খুব শক্তিশালী:

  • কাঠামোর অখণ্ডতা প্রয়োগ করুন
  • একটি ফিল্টারড আইডিতে বাছাই সক্ষম করুন

এনফোর্স স্ট্রাকচার সংহত

যৌগিক সূচকগুলি কেবলমাত্র অন্য ধরণের সূচক নয়; তারা প্রাথমিক কী হিসাবে অখণ্ডতা প্রয়োগ করে একটি টেবিলে NECESSARY কাঠামো সরবরাহ করতে পারে।

মাইএসকিএল-র ইনোডব ক্লাস্টারিংকে সমর্থন করে এবং নিম্নলিখিত উদাহরণটি ব্যাখ্যা করে যে একটি সংমিশ্র সূচক কেন প্রয়োজন হতে পারে।

(অর্থাত একটি সামাজিক নেটওয়ার্কের জন্য) একটি বন্ধুর টেবিল তৈরি করতে হলে আমরা 2 কলাম প্রয়োজন: user_id, friend_id

টেবিল স্ট্রাকচার

user_id (medium_int)
friend_id (medium_int)

Primary Key -> (user_id, friend_id)

পুণ্যক্রমে, একটি প্রাথমিক কী (পিকে) অনন্য এবং একটি যৌগিক পিকে তৈরি করে, ইনোডব স্বয়ংক্রিয়ভাবে পরীক্ষা করবে যে কোনও user_id, friend_idনতুন রেকর্ড যুক্ত হওয়ার পরে কোনও সদৃশ উপস্থিত নেই। এটি প্রত্যাশিত আচরণ কারণ কোনও ব্যবহারকারীর friend_id = 2উদাহরণস্বরূপ 1 টির বেশি রেকর্ড (সম্পর্কের লিঙ্ক) থাকা উচিত নয় ।

যৌগিক পিকে ছাড়া আমরা একটি সারোগেট কী ব্যবহার করে এই স্কিমা তৈরি করতে পারি:

user_friend_id
user_id
friend_id

Primary Key -> (user_friend_id)

এখন, যখনই কোনও নতুন রেকর্ড যুক্ত হবে তখন আমাদের পরীক্ষা করতে হবে যে সংমিশ্রণের সাথে পূর্ববর্তী রেকর্ডটি user_id, friend_idইতিমধ্যে বিদ্যমান নেই।

যেমন, একটি যৌগিক সূচক কাঠামোর অখণ্ডতা প্রয়োগ করতে পারে।

ফিল্টারড আইডিতে বাছাই সক্ষম করুন

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

সারণী ব্যবহারকারী_ওয়াল_পোস্ট (ভাবুন ফেসবুকের প্রাচীর পোস্টগুলি)

user_id (medium_int)
timestamp (timestamp)
author_id (medium_int)
comment_post (text)

Primary Key -> (user_id, timestamp, author_id)

আমরা জিজ্ঞাসা করতে চাই user_id = 10এবং timestamp(পোষ্টের) দ্বারা পোস্টের পোস্টগুলি বাছাই করতে এবং পোস্ট করতে চাই ।

এসকিউএল QUERY

SELECT * FROM User_Wall_Posts WHERE user_id = 10 ORDER BY timestamp DES

যৌগিক পিকে মাইএসকিএলকে সূচকটি ব্যবহার করে ফলাফলগুলি ফিল্টার এবং সারণ করতে সক্ষম করে; ফলাফল আনতে মাইএসকিএলকে অস্থায়ী ফাইল বা ফাইলসোর্ট ব্যবহার করতে হবে না। সম্মিলিত কী ব্যতীত এটি সম্ভব হবেনা এবং খুব অযোগ্য ক্যোয়ারী তৈরি করবে।

এর মতো, যৌগিক কীগুলি খুব শক্তিশালী এবং সাধারণ সমস্যার তুলনায় "আমি অনুসন্ধান করতে চাই column_a, column_bতাই আমি যৌগিক কী ব্যবহার করব my একটি যৌগিক কী ব্যবহার!


5

যৌগিক সূচকগুলি এর জন্য দরকারী

  • 0 বা ততোধিক "=" ধারা, প্লাস
  • সর্বাধিক এক পরিসীমা ধারা।

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

নিকটতম সন্ধান করুন - যদি প্রশ্নটি সত্যিই অনুকূলিতকরণ সম্পর্কিত is

WHERE geolat BETWEEN ??? AND ???
  AND geolng BETWEEN ??? AND ???

তাহলে কোনও সূচক সত্যই উভয় মাত্রা পরিচালনা করতে পারে না।

পরিবর্তে, একজনকে অবশ্যই 'বাক্স থেকে ভাবতে হবে'। পার্টিশনের মাধ্যমে যদি একটি মাত্রা বাস্তবায়ন করা হয় এবং অন্যটি সাবধানে বাছাই করে প্রয়োগ করা হয় PRIMARY KEY, তবে ল্যাট / এলএনজি লুকের খুব বড় টেবিলগুলির জন্য একটি উল্লেখযোগ্যভাবে আরও ভাল দক্ষতা পেতে পারেন। আমার ল্যাটলং ব্লগটি পৃথিবীতে কীভাবে "নিকটস্থ সন্ধান করুন" প্রয়োগ করতে হবে তার বিশদগুলিতে যায়। এটি কোড অন্তর্ভুক্ত।

PARTITIONsঅক্ষাংশ রেঞ্জ ফিতে আছে। PRIMARY KEYইচ্ছাকৃতভাবে দ্রাঘিমাংশ দিয়ে শুরু হয়, যাতে দরকারী সারি একই ব্লক হতে করার সম্ভাবনা বেশি। একটি স্টোরড রুটিন order by... limit...আপনার পর্যাপ্ত পরিমাণে কফি শপ না পাওয়া (বা যাই হোক না কেন) লক্ষ্যের চারপাশে 'বর্গক্ষেত্র' বাড়ানোর জন্য অগোছালো কোডকে অর্কেস্ট্রেট করে । এটি দুর্দান্ত-চেনাশোনার গণনা এবং ডেটলাইন এবং মেরুগুলি পরিচালনা করতেও যত্ন নেয়।

অধিক

আমি অন্য একটি ব্লগ লিখেছি; এটি ল্যাট / এলএনজি অনুসন্ধানের 5 টি উপায়ের সাথে তুলনা করে: http://mysql.rjweb.org/doc.php/latlng # এবং এটি নির্দিষ্ট করে যে তারা নির্দিষ্ট ক্ষেত্রে অনুকূল :

INDEX(geolat, geolng),
INDEX(geolng, geolat)

এটি হ'ল দুটি সূচকে উভয় কলাম থাকা, এবং জিওল্যাট এবং জিওলংয়ে একক-কলাম সূচী না থাকা গুরুত্বপূর্ণ।


1

কোনও কালো এবং সাদা নেই, একটি আকার সব উত্তর ফিট করে all

আপনার ক্যোয়ারী কাজের বোঝা যখন কোনওটির দ্বারা উপকৃত হবে তখন আপনার একটি যৌগিক সূচক ব্যবহার করা উচিত।

এটি নির্ধারণ করতে আপনাকে আপনার ক্যোয়ারির কাজের বোঝার প্রোফাইল তৈরি করতে হবে।

একটি যৌগিক সূচক কার্যকর হয় যখন প্রশ্নগুলি সেই সূচক থেকে পুরোপুরি সন্তুষ্ট হতে পারে।

আপডেট (পোস্ট করা প্রশ্নে সম্পাদনের প্রতিক্রিয়া হিসাবে): আপনি যদি টেবিল থেকে * নির্বাচন করছেন তবে যৌগিক সূচক ব্যবহার করা যেতে পারে, এটি নাও পারে। নিশ্চিত হওয়ার জন্য আপনাকে এক্সপ্ল্যান প্ল্যান চালানো দরকার ।


জিও অবস্থানের ডেটা (অক্ষাংশ এবং দ্রাঘিমাংশ) এর জন্য কোনও যৌগিক সূচক ব্যবহার করা কী বোঝায়?
টেডি

1
এটি পুরোপুরি নির্ভর করে যে সেই টেবিলের বিরুদ্ধে কী প্রশ্ন করা হচ্ছে on
মিচ গম

সম্পাদিত সর্বাধিক সাধারণ ক্যোয়ারী অন্তর্ভুক্ত করার জন্য আমি আমার মূল পোস্টটি আপডেট করেছি। উপরে দেখুন.
টেডি 3

1

স্পেসিয়াল অনুসন্ধানগুলি করার জন্য আপনার একটি আর-ট্রি অ্যালগরিদম দরকার যা ভৌগলিক অঞ্চলগুলি খুব দ্রুত অনুসন্ধান করার অনুমতি দেয়। এই কাজের জন্য আপনার ঠিক কী প্রয়োজন।

কিছু ডাটাবেসে স্পেসিয়াল ইনডেক্সগুলি অন্তর্নির্মিত থাকে A মাইএসকিউএল 5 এ একটি দ্রুত গুগল অনুসন্ধান দেখায় (যা আপনার এসকিউএলটির দিকে তাকিয়ে আমি অনুমান করছি যে আপনি মাইএসকিউএল ব্যবহার করছেন)।


1

সম্মিলিত সূচকটি কার্যকর হতে পারে যখন আপনি group byঅনুচ্ছেদটি অনুকূল করতে চান (এই নিবন্ধটি http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html দেখুন )। মনোযোগ দিবেন দয়া করে:

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


GROUP BYউল্লেখ করা হয়নি।
রিক জেমস

কোথায় বলা হয়নি? :) আমি উল্লেখ নিবন্ধে এটি স্পষ্টভাবে উল্লেখ করা হয়। এবং এটি জিজ্ঞাসা করা প্রশ্নগুলির উত্তর দেয়: কখন আমি একটি ডাটাবেসে একটি যৌগিক সূচক ব্যবহার করব? যৌগিক সূচক ব্যবহার করে পারফরম্যান্স র‌্যামিফিকেশন কী কী)? আমি কেন একটি যৌগিক সূচক ব্যবহার করব?
আলেকজান্ডার

সংশোধন: GROUP BYওপি দ্বারা উল্লেখ করা হয়নি।
রিক জেমস

অবশ্যই, এটি উত্তর ছিল - একটি ক্ষেত্রে যখন আমরা একটি ডাটাবেসে একটি যৌগিক সূচক ব্যবহার করব।
আলেকজান্ডার

0

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

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

select *, sqrt(  pow(h2.geolat - h1.geolat,  2) 
               + pow(h2.geolng - h1.geolng, 2) ) as distance
from homes h1, homes h2
where h1.home_id = 12345 and h2.home_id != h1.home_id
order by distance

এবং সূচক খুব সম্ভবত কোনও উপকারী হবে না। ভূস্থানিক প্রশ্নের জন্য, আপনার মত কিছু প্রয়োজন এই

আপডেট: এই প্রশ্নের সাথে:

SELECT * FROM homes
WHERE geolat BETWEEN ??? AND ???
AND geolng BETWEEN ??? AND ???

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


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