2010-04-14 20 views
15

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

मैं रिकॉर्ड का एक प्रकार का एक पूर्ण-पाठ खोज करना चाहते हैं, और कहा कि InnoDB तालिकाओं के साथ मूल रूप से समर्थित नहीं है। मैं विदेशी कुंजी समर्थन की कमी के कारण MyISAM टेबल पर जाने के लिए तैयार नहीं हूं और इस तथ्य के कारण कि उनकी लॉकिंग प्रति तालिका है, प्रति पंक्ति नहीं।

यह बुरा व्यवहार रिकॉर्ड मैं MyISAM इंजन का उपयोग खोज और उपयोग करें कि पूर्ण-पाठ खोज के लिए की जरूरत है की एक मिरर तालिका बनाने के लिए होगा? इस तरह से मैं सिर्फ डेटा की प्रतिलिपि खोज रहा हूं और यदि उस डेटा से कुछ भी होता है तो यह एक सौदे के जितना बड़ा नहीं होता है क्योंकि इसे हमेशा फिर से बनाया जा सकता है।

या यह यह है कि परहेज किया जाना चाहिए करने का एक अजीब तरीका है?

धन्यवाद।

+0

वहाँ एक बहुत अच्छी Percona से विकल्पों में से विवरण दिया गया है: http://www.mysqlperformanceblog.com/2009/09/10/what-to-do-with-mysql-full-text- खोज-समय-माइग्रेटिंग-टू-innodb/ – cce

उत्तर

7

मुझे लगता है कि यह वास्तव में अजीब है।

CREATE TEMPORARY TABLE search_mirror (FULLTEXT INDEX (col1, col2, ...)) Engine=MyISAM SELECT * FROM original_innodb_table; 

SELECT * FROM search_mirror WHERE MATCH(col1, col2, ...) AGAINST ('foo'); 

DROP TEMPORARY TABLE search_mirror; 

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

हाँ मुझे एहसास है कि यह सही मिररिंग/प्रतिकृति नहीं है। हां, मुझे लगता है कि टेबल को डुप्लिकेट करना महंगा हो सकता है (यहां अपेक्षाकृत छोटे डेटासेट)। जैसे मैंने कहा, त्वरित और गंदे प्रोटोटाइप। वाईएमएमवी

+4

सहमत हैं। यह वास्तव में अजीब है। – Abinadi

+0

कोड से बेहतर चीज चेतावनी थी। : पी –

+0

प्रत्येक क्वेरी पर पूरी अनुक्रमणिका को पुनर्निर्माण कैसे किया जाएगा 'LIKE' के साथ खोज से बेहतर होगा? –

2

आप दर्पण तालिका बना सकते हैं। यह शायद आदर्श से कम है, क्योंकि MyISAM तालिका आपके लेन-देन का सम्मान नहीं करेगी (यदि लेनदेन इनओडीबी पर विफल हुआ है, तो उस लेनदेन में माईसाम में किए गए आपके परिवर्तन अभी भी दिखाई देंगे)।

आप एक समर्पित पूर्ण-पाठ खोज प्रणाली का उपयोग कर सकते हैं जैसे Sphinx, जो मैंने पूर्ण-पाठ खोज के लिए उपयोग किया है (चूंकि मेरा डेटाबेस InnoDB है)।

9

आप चलाता का उपयोग कर (mysql के अपने संस्करण के लिए उन्हें समर्थन करता है) के लिए डेटा समन्वयन किसी तरह ऐसा करने में सक्षम हो सकता है। वे आपको कुछ बिंदुओं पर SQL के छोटे स्निपेट चलाने की अनुमति देते हैं जैसे डेटा को तालिका में डालने या हटाने के बाद।

उदाहरण के लिए ...

create trigger TRIGGER_NAME after insert on INNODB_TABLE 
insert into MYISAM_TABLE select * from INNODB_TABLE 
where id = last_insert_id(); 

... जब डेटा InnoDB तालिका में डाला जाता है, एक ही डेटा स्वचालित रूप से MyISAM तालिका में डाला जाता है।

+0

क्या यह समाधान jdbc और mysql 5.1 के साथ काम करेगा? – Noona

+0

हाँ ट्रिगर 5.1 – michael

+0

@Noona जेडीबीसी में समर्थित हैं ट्रिगर्स के साथ कोई लिंक नहीं है जो मुझे पता है कि डेटाबेस पक्ष हैं। माइकल के लिए आपका समाधान पहली नज़र के रूप में काफी गंदा है लेकिन काफी कुशल है (क्या प्रत्येक डालने के बाद यह सभी डेटा पुन: सम्मिलित नहीं करेगा?) – AsTeR

1

मुझे लगता है कि इस समस्या के लिए सबसे सरल समाधान के एक सूचकांक तालिका जो तालिका जो वास्तविक डेटा शामिल करने के लिए वापस खोजों के लिए इस्तेमाल किया जाएगा, एक सूचक के साथ की रचना है। मुझे बिल्कुल वही समस्या का सामना करना पड़ रहा है और मैं इनो डीडी टेबल द्वारा दिए गए दिमाग की शांति के कारण अपने सिस्टम के लिए माईसाम टेबल का उपयोग नहीं करना चाहता हूं।

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

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

1

अच्छी खबर! MySQL 5.6 और ऊपर में, पूर्ण-पाठ अनुक्रमणिका का उपयोग इनो डीबी टेबल के साथ किया जा सकता है। यदि आपने अभी तक नहीं किया है तो आपको अपने MySQL को 5.6 या ऊपर अपडेट करने पर विचार करना चाहिए।

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

MySQL 5.6 Manual - Full-Text Search Functions

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