2012-05-15 11 views
46

मुझे ओरेकल में याद है यह एक समारोह के आधार पर सूचकांक के लिए संभव है, उदा। SUBSTRING(id,1,8)क्या MySQL में फ़ंक्शन-आधारित अनुक्रमणिका होना संभव है?

क्या MySQL इसका समर्थन करता है? यदि नहीं, तो क्या कोई विकल्प है?

+0

आप पहले चरित्र को छोड़ मतलब ? मुझे नहीं लगता कि यह संभव है :) –

उत्तर

46

नहीं, सामान्य अर्थ में नहीं, मुझे विश्वास नहीं है कि 5.6 में भी यह कार्यक्षमता है। यह है केवल कॉलम के अग्रणी भाग का उपयोग करने के लिए संभव है (यह कार्यक्षमता लंबे समय तक आसपास रही है), लेकिन दूसरे या बाद के वर्णों में से कोई भी शुरू नहीं होता है, या कोई अन्य जटिल कार्य नहीं होता है।

उदाहरण के लिए, निम्नलिखित एक सूचकांक एक नाम के पहले पांच अक्षरों का उपयोग बनाता है:

create index name_first_five on cust_table (name(5)); 

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

अनावश्यक डेटा के लिए बर्बाद जगह के अलावा, यह वही बात है।

और, हालांकि यह तकनीकी रूप से 3 एनएफ का उल्लंघन करता है, यह डेटा को सिंक में रखने के लिए ट्रिगर्स के उपयोग से कम हो जाता है (यह ऐसा कुछ है जो अक्सर अतिरिक्त प्रदर्शन के लिए किया जाता है)।

+0

धन्यवाद ... मेरे मामले के लिए मुझे केवल स्ट्रिंग के पहले 8 वर्णों को इंडेक्स के रूप में उपयोग करने की आवश्यकता है। क्या मैं इसका उपयोग कर सकता हूं: cust_table पर नाम index_first_8 बनाएं (नाम (8)); – user836026

+2

@ user836026: हाँ, यह काम करना चाहिए। – paxdiablo

+0

@paxdiablo, कृपया 5.6 '5.7' अपडेट करें। यदि आप इसमें उद्धरण 8.0 जोड़ते हैं तो बहुत अच्छा होगा। – Adrian

12

यह Generated Columns का उपयोग करके MySQL 5.7.5 के रूप में संभव है।

17

MySQL इसका समर्थन नहीं करता है, लेकिन एक विकल्प है।

1. MySQL 5.7.6 के बाद से

आपको एक स्वत: उपयोग कर सकते हैं स्तंभ उत्पन्न उस पर एक सूचकांक के साथ-स्ट्रिंग धारण करने के लिए:

CREATE TABLE SomeTable (
    id CHAR(10), 
    sub_id CHAR(8) AS SUBSTRING(id, 1, 8) STORED, INDEX(sub_id) 
) 

Benjamin के रूप में बताया गया है, InnoDB माध्यमिक अनुक्रमणिका का समर्थन करता है वर्चुअल कॉलम पर ताकि स्टोर किए गए कीवर्ड को हटाया जा सके। वास्तव में वर्चुअल कॉलम पर द्वितीयक अनुक्रमणिका बेहतर हो सकती है। अधिक यहाँ जानकारी: Secondary Indexes and Generated Columns

2. इससे पहले कि MySQL के 5.7.6

आप इस पर एक सूचकांक के साथ एक कॉलम एक ट्रिगर के द्वारा अद्यतन का उपयोग कर सकते हैं:

CREATE TABLE SomeTable (
    id CHAR(10), 
    sub_id CHAR(8) , INDEX(sub_id) 
); 

CREATE TRIGGER TR_SomeTable_INSERT_sub_id 
    BEFORE INSERT 
    ON SomeTable FOR EACH ROW 
    SET NEW.sub_id = SUBSTRING(NEW.id, 1, 8); 

CREATE TRIGGER TR_SomeTable_UPDATE_sub_id 
    BEFORE UPDATE 
    ON SomeTable FOR EACH ROW 
    SET NEW.sub_id = SUBSTRING(NEW.id, 1, 8); 
+1

ध्यान दें कि [प्रलेखन] (https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html) के अनुसार, * InnoDB आभासी कॉलम पर द्वितीयक अनुक्रमणिका का समर्थन करता है *। तो आप कॉलम वर्चुअल बनाने के लिए 'STORED' कीवर्ड को छोड़ सकते हैं, कुछ संग्रहण स्थान सहेज सकते हैं, और अभी भी डेटा अनुक्रमित है! – Benjamin

संबंधित मुद्दे