मुझे एक समग्र सूचकांक का उपयोग कब करना चाहिए?


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

EXPLAIN रिटर्न:

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 )

उन फ़ील्ड्स का उपयोग करने, फ़िल्टर करने और कभी-कभी चयन करने के लिए उन क्वेरी का लाभ उठाएगा। यह उन प्रश्नों को भी लाभान्वित करेगा जो उस समग्र में कॉलम के बाएं-सबसे सबसेट का उपयोग करते हैं। इसलिए उपरोक्त सूचकांक भी उन प्रश्नों को संतुष्ट करेगा जिनकी आवश्यकता है

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

लेकिन यह (कम से कम सीधे नहीं, शायद यह आंशिक रूप से मदद कर सकता है अगर कोई बेहतर सूचकांक नहीं है) प्रश्नों की आवश्यकता के लिए मदद कर सकता है

index( column_A, column_C )

ध्यान दें कि कॉलम_B कैसे गायब है।

आपके मूल उदाहरण में, दो आयामों के लिए एक समग्र सूचकांक ज्यादातर उन प्रश्नों पर लाभान्वित करेगा जो दोनों आयामों पर क्वेरी करते हैं या अपने आप से सबसे बाएं आयाम, लेकिन स्वयं द्वारा सबसे सही आयाम नहीं। यदि आप हमेशा दो आयामों को क्वेरी कर रहे हैं, तो एक समग्र सूचकांक जाने का तरीका है, वास्तव में कोई फर्क नहीं पड़ता है जो पहले है (सबसे शायद)।


1
मार्क, मैंने अपनी मूल पोस्ट (अपडेट 2) अपडेट कर दी है। यह मेरी वास्तविक क्वेरी है। मेरा वास्तविक डीबी स्कीमा। और क्या EXPLAIN कमांड देता है। तो, इस जानकारी के साथ - क्या मुझे एक समग्र सूचकांक का उपयोग करना चाहिए। मैं अभी भी अस्पष्ट हूं। अग्रिम में धन्यवाद।
टेडी

मार्क, क्या आपके उत्तर में समग्र सूचकांक अनुक्रमणिका (column_C) को संतुष्ट करता है?
बोरिस डी। तेहरोव

मुझे यकीन नहीं है कि मैं आपके सवाल को समझ सकता हूँ। लेकिन, यदि आप पूछ रहे हैं कि क्या सूचकांक (ए, बी, सी) कॉलम सी पर फिल्टर करने वाली क्वेरी में मदद करेगा, तो इसका जवाब आमतौर पर नहीं होगा, यह फ़िल्टरिंग के लिए सूचकांक का उपयोग नहीं करेगा। हालाँकि यह टेबल स्कैन को खत्म करने के लिए इंडेक्स का उपयोग कर सकता है यदि आप केवल एबीसी के सबसेट पर चयन कर रहे हैं। तो, यह अलग है, लेकिन संबंधित है। लेकिन फ़िल्टरिंग को सक्षम करने के लिए अनुक्रमित के विशिष्ट उपयोगों के लिए, उत्तर नहीं है।
मार्क कैनलास

1
-1 क्योंकि एक समग्र सूचकांक के साथ मदद नहीं करता है WHERE geolat BETWEEN ??? AND ??? AND geolng BETWEEN ??? AND ???। यह पहले क्षेत्र के बाद बंद हो जाएगा। "प्रश्न अतिप्रवाह" से उत्तर बताता है कि क्यों।
रिक जेम्स

1
@felwithe MySQL क्वेरी में सभी तालिकाओं में से प्रत्येक प्रति एक सूचकांक का उपयोग कर सकता है (छूट यहां हैं। उदाहरण के लिए, अनुक्रमित का विलय)। आदर्श रूप से इसका मतलब है कि क्वेरी में एक तालिका, जहां-क्लाज, टेबल जॉइन, ग्रुप-बाय और ऑर्डर-बाय सभी के लिए एक ही इंडेक्स का उपयोग करना चाहिए। इसलिए प्रत्येक स्तंभ पर एक अलग सूचकांक हमेशा काम नहीं कर सकता है, लेकिन एक समग्र सूचकांक जादू कर सकता है।
AKHIL MATHEW

56

कल्पना कीजिए कि आपके पास निम्नलिखित तीन प्रश्न हैं:

प्रश्न I:

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

क्वेरी II:

SELECT * FROM homes WHERE `geolat`=42.9

प्रश्न III:

SELECT * FROM homes WHERE `geolng`=36.4

यदि आपके पास प्रति स्तंभ अनुक्रमणिका है, तो सभी तीन प्रश्न अनुक्रमणिका का उपयोग करते हैं। MySQL में, यदि आपके पास समग्र सूचकांक ( geolat, geolng) है, तो केवल क्वेरी I और क्वेरी II (जो कंपोजिट इंडेक्स के पहले भाग का उपयोग कर रहा है) इंडेक्स का उपयोग करता है। इस स्थिति में, क्वेरी III को पूर्ण तालिका खोज की आवश्यकता होती है।

पर एकाधिक-स्तंभ इंडेक्स मैनुअल की धारा है, यह स्पष्ट रूप से समझाया गया है कि कैसे कई स्तंभ अनुक्रमणिका काम करते हैं, तो मैं मैनुअल फिर से टाइप नहीं करना चाहती।

से MySQL संदर्भ मैनुअल पेज :

एकाधिक-कॉलम इंडेक्स को एक सॉर्ट किया गया सरणी माना जा सकता है जिसमें मान शामिल होते हैं जो इंडेक्स किए गए कॉलम के मान को बदलते हैं

यदि आप जियोलाट और जियोलिंग कॉलम के लिए अलग-अलग सूचकांक का उपयोग करते हैं, तो आपके पास अपनी तालिका में दो अलग-अलग सूचकांक हैं जिन्हें आप स्वतंत्र खोज सकते हैं।

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

आरआरएन रिश्तेदार रिकॉर्ड संख्या है (सरल बनाने के लिए, आप आईडी कह सकते हैं)। पहले दो सूचकांक उत्पन्न अलग और तीसरे सूचकांक समग्र है। जैसा कि आप देख सकते हैं कि आप भूगोल पर आधारित जियोलॉजी पर आधारित खोज कर सकते हैं क्योंकि इसे जियोलैट द्वारा अनुक्रमित किया जाता है, हालांकि यह जियोलैट या "जियोलैट एंड जियोलिंग" द्वारा खोजना संभव है (चूंकि जियोलिंग दूसरे स्तर का सूचकांक है)।

इसके अलावा, MySQL यूज़ेज इंडेक्स मैनुअल सेक्शन पर एक नज़र डालें ।


1
वास्तव में, मेरे पास उन प्रश्नों में से कोई भी नहीं है। मेरी क्वेरी मूल पोस्ट में सूचीबद्ध है। मेरी क्वेरी एक वर्ग ग्रिड के भीतर घरों में लौटने के लिए है। मैं स्थानिक के बारे में जानता हूं और मैं दूरियों की गणना करने की कोशिश नहीं कर रहा हूं। मैं बस यह जानना चाहता हूं कि क्या एक कंपोजिट इंडेक्स का उपयोग करने से समझ में आता है जब मैं किसी विशेष जियो ग्रिड (जैसे पड़ोस / शहर / काउंटी) के भीतर सभी घरों को प्रदर्शित करने की कोशिश कर रहा हूं
टेडी

Eyazici, मैंने अपनी मूल पोस्ट (अपडेट 2) अपडेट कर दी है। यह मेरी वास्तविक क्वेरी है। मेरा वास्तविक डीबी स्कीमा। और क्या EXPLAIN कमांड देता है। तो, इस जानकारी के साथ - क्या मुझे एक समग्र सूचकांक का उपयोग करना चाहिए। मैं अभी भी अस्पष्ट हूं। अग्रिम धन्यवाद
टेडी

@ "वास्तव में, मेरे पास उन प्रश्नों में से कोई भी नहीं है।" वास्तव में आपके पास, मैंने आधार तर्क की खोज के लिए साधारण WHERE शर्त का उपयोग किया है। एक कॉलम पर सशर्त (यानी। WHERE) का उपयोग करते समय MySQL जब भी संभव हो इंडेक्स का उपयोग करने की कोशिश करता है। "x बेटन ए और बी" "एक्स> ए एंड एक्स <बी" के समान है। आपने अपने क्वेरी सशर्त में भूगोल और जियोलाट दोनों स्तंभों का उपयोग किया है। यदि आप कंपोज़िट इंडेक्स "(जियोलैट, जियोलिंग)" अपने "और जियोलिंग बेटविन का उपयोग करते हैं ??? और ??? सशर्त सूचकांक के लाभ नहीं है (यह MySQL के लिए है)। इसलिए आपको अपने परिदृश्य के लिए प्रति कॉलम अलग सूचकांक का उपयोग करना चाहिए
इमरे यज़ीसी

मुझे समझ नहीं आ रहा है। जब मैं हमेशा दोनों कॉलमों को शामिल करता हूं, तो मैं जियोल्ट और जियोलॉन्ग के लिए अलग-अलग इंडेक्स का उपयोग क्यों करूं
टेडी

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कॉलम पर एक सूचकांक के समान होने वाली है।

जैसा कि विल ने उल्लेख किया है, MySQL स्थानिक विस्तार समर्थन प्रदान करता है । एक स्थानिक बिंदु को दो अलग-अलग lat lngस्तंभों के बजाय एकल स्तंभ में संग्रहीत किया जाता है । ऐसे स्तंभ पर स्थानिक सूचकांक लागू किया जा सकता है। हालांकि, दक्षता मेरे व्यक्तिगत अनुभव के आधार पर ओवरराइड की जा सकती है। यह हो सकता है कि स्थानिक सूचकांक दो आयामी समस्या का समाधान नहीं करता है, लेकिन द्विघात विभाजन के साथ आर-ट्रीज़ का उपयोग करके खोज को गति प्रदान करता है ।

व्यापार बंद यह है कि एक स्थानिक बिंदु बहुत अधिक मेमोरी का उपभोग करता है क्योंकि यह निर्देशांक भंडारण के लिए आठ-बाइट डबल-सटीक संख्याओं का उपयोग करता है। अगर मैं ग़लत हूं तो मेरी गलती सुझाएं।


5

समग्र सूचकांक बहुत शक्तिशाली हैं क्योंकि वे:

  • संरचना अखंडता लागू करें
  • फ़िल्टर्ड आईडी पर सॉर्टिंग सक्षम करें

पर्यावरण संरचना एकीकरण

समग्र सूचकांक केवल एक अन्य प्रकार के सूचकांक नहीं हैं; वे प्राथमिक कुंजी के रूप में अखंडता को लागू करके एक तालिका के लिए आवश्यक संरचना प्रदान कर सकते हैं।

मैसूर के इनोडब क्लस्टरिंग का समर्थन करता है और निम्नलिखित उदाहरण दिखाता है कि एक समग्र सूचकांक आवश्यक क्यों हो सकता है।

(यानी एक सामाजिक नेटवर्क के लिए) एक मित्र 'टेबल बनाने के लिए हम 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_Wall_Posts (सोचें कि क्या फेसबुक की दीवार पोस्ट)

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

Primary Key -> (user_id, timestamp, author_id)

हम ( user_id = 10पोस्ट timestamp) द्वारा टिप्पणी पोस्ट के लिए सभी पोस्टों को क्वेरी करना और ढूंढना चाहते हैं ।

SQL QUERY

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

समग्र पीके मैसकल को इंडेक्स का उपयोग करके परिणामों को फ़िल्टर और सॉर्ट करने में सक्षम बनाता है; परिणामों को प्राप्त करने के लिए मैसकल को एक अस्थायी फ़ाइल या फाइलोर्ट का उपयोग नहीं करना होगा। एक समग्र कुंजी के बिना, यह संभव नहीं होगा और एक बहुत ही अयोग्य क्वेरी का कारण होगा।

इस प्रकार, मिश्रित कुंजियाँ बहुत शक्तिशाली होती हैं और "मैं जिस खोज को करना चाहता हूँ, उसकी सरल समस्या से अधिक सूट करता हूँ। column_a, column_bइसलिए मैं समग्र कुंजियों का उपयोग करूँगा। अपने वर्तमान डेटाबेस स्कीमा के लिए, मेरे पास एकल कुंजियों की तरह ही कई मिश्रित कुंजियाँ हैं। एक समग्र कुंजी का उपयोग!


5

समग्र सूचकांक के लिए उपयोगी हैं

  • 0 या अधिक "=" खंड, प्लस
  • अधिकतम एक सीमा खंड में।

एक समग्र सूचकांक दो श्रेणियों को संभाल नहीं सकता है। मैं अपनी सूचकांक रसोई की किताब में इसके बारे में आगे चर्चा करता हूं ।

निकटतम खोजें - यदि प्रश्न वास्तव में अनुकूलन के बारे में है

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

तब कोई भी सूचकांक वास्तव में दोनों आयामों को नहीं संभाल सकता है।

इसके बजाय, एक को 'बॉक्स से बाहर सोचना चाहिए'। यदि एक आयाम को विभाजन के माध्यम से कार्यान्वित किया जाता है और दूसरे को सावधानीपूर्वक उठाकर कार्यान्वित किया जाता है PRIMARY KEY, तो किसी को लैट / लैंग लुकअप की बहुत बड़ी तालिकाओं के लिए काफी बेहतर दक्षता मिल सकती है। मेरा लाटल ब्लॉग इस बात की जानकारी देता है कि ग्लोब पर "निकटतम खोजें" को कैसे लागू किया जाए। इसमें कोड शामिल है।

PARTITIONsअक्षांश पर्वतमाला की धारियों हैं। PRIMARY KEYजान-बूझकर देशांतर के साथ शुरू होता है, ताकि उपयोगी पंक्तियों में एक ही ब्लॉक में होने की संभावना है। एक संग्रहीत नियमित करने के लिए गड़बड़ करने के लिए order by... limit...और जब तक आपके पास पर्याप्त कॉफी की दुकानें (या जो भी हो) लक्ष्य के चारों ओर 'वर्ग' बढ़ने के लिए गन्दा कोड ऑर्केस्ट्रा करता है । यह महान-सर्कल गणना और डेटलाइन और डंडे को संभालने का भी ध्यान रखता है।

अधिक

मैंने एक और ब्लॉग लिखा है; यह lat / lng खोजों को करने के 5 तरीकों की तुलना करता है: http://mysql.rjweb.org/doc.php/latlng#repretation_choices (यह 5. के रूप में ऊपर दिए गए लिंक का संदर्भ देता है) अन्य तरीकों में से एक यह है, और यह बताता है कि वे विशेष मामले के लिए इष्टतम हैं :

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

है यही कारण है, के इंडेक्स में दोनों स्तंभ होने, और नहीं geolat और geolng पर एकल-स्तंभ अनुक्रमित होने महत्वपूर्ण है।


1

कोई भी ब्लैक एंड व्हाइट नहीं है, एक आकार सभी उत्तर में फिट बैठता है।

आपको एक समग्र सूचकांक का उपयोग करना चाहिए, जब आपका क्वेरी काम लोड एक से लाभ होगा।

इसे निर्धारित करने के लिए आपको अपने क्वेरी वर्क लोड की रूपरेखा तैयार करनी होगी।

एक समग्र सूचकांक खेलने में आता है जब प्रश्न उस सूचकांक से पूरी तरह से संतुष्ट हो सकते हैं।

अद्यतन (पोस्ट किए गए प्रश्न को संपादित करने के लिए): यदि आप तालिका से * का चयन कर रहे हैं, तो समग्र सूचकांक का उपयोग किया जा सकता है, यह नहीं हो सकता है। यह सुनिश्चित करने के लिए आपको EXPLAIN PLAN चलाना होगा ।


क्या यह भू स्थान डेटा (अक्षांश और देशांतर) के लिए एक समग्र सूचकांक का उपयोग करने के लिए समझ में आता है?
टेडी

1
यह पूरी तरह से इस बात पर निर्भर करता है कि उस तालिका के खिलाफ क्या प्रश्न किए जा रहे हैं।
मिच गेहूं

मैंने अपने मूल पोस्ट को अपडेट किया है जिसमें सबसे आम क्वेरी को शामिल किया गया है। ऊपर देखो।
टेडी

1

स्थानिक खोज करने के लिए, आपको एक आर-ट्री एल्गोरिथ्म की आवश्यकता होती है, जो भौगोलिक क्षेत्रों को बहुत तेज़ी से खोजने की अनुमति देता है। वास्तव में इस नौकरी के लिए आपको क्या चाहिए।

कुछ डेटाबेस में स्थानिक इंडेक्स बनाए गए हैं। एक त्वरित Google खोज से पता चलता है कि MySQL 5 ने उन्हें (जो आपके SQL को देखकर मुझे अनुमान लगा रहा है कि आप MySQL का उपयोग कर रहे हैं)।


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 ???

क्वेरी विश्लेषक अकेले जियोलैट पर एक इंडेक्स का उपयोग कर सकता है, या अकेले जियोलॉजी पर एक इंडेक्स, या संभवतः दोनों इंडेक्स का उपयोग कर सकता है। मुझे नहीं लगता कि यह एक समग्र सूचकांक का उपयोग करेगा। लेकिन वास्तविक डेटा सेट पर इनमें से प्रत्येक क्रमपरिवर्तन की कोशिश करना आसान है और फिर (ए) देखें कि एक्सप्लेन आपको क्या बताता है और (बी) क्वेरी वास्तव में लगने वाले समय को मापता है।


मैं बस एक वर्ग ग्रिड के भीतर घरों में लौटने के लिए उपयोग कर रहा हूँ। मुझे स्थानिक के बारे में पता है, इसलिए मैं दूरी की गणना करने की कोशिश नहीं कर रहा हूं। मैं बस वर्ग ग्रिड के भीतर घरों को वापस करना चाहता हूं और चाहता हूं कि जल्दी से प्रदर्शन करें। जैसे, मैं यह सुनिश्चित करना चाहता हूं कि मेरे पास मेरी अनुक्रमणिका सही ढंग से हो। क्या उससे मदद हुई?
टेडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.