2012-07-05 36 views
6

मैं कैसंद्रा 1.1.2 का उपयोग कर रहा हूं, मैं एक आरडीबीएमएस एप्लिकेशन को कैसंद्रा में बदलने की कोशिश कर रहा हूं।कैसंद्रा: जहां क्लॉज जिसमें महान या कम से कम (< and >)

| Col1 | Col2 | Col3 | Col4 | 
  1. Col1: स्ट्रिंग (प्राथमिक कुंजी)
  2. Col2: स्ट्रिंग (प्राथमिक कुंजी)
  3. Col3: BigInt (इंडेक्स)
  4. Col4 मेरी आरडीबीएमएस आवेदन में मैं मेज कहा जाता table1 निम्नलिखित है : बिगिन

यह तालिका 200 मिलियन से अधिक रिकॉर्ड की गणना करती है। तालिका बनाने के लिए

Select * from table where col3 < 100 and col3 > 50; 

कैसेंड्रा में मैं निम्नलिखित इस्तेमाल बयान:

create table table1 (primary_key varchar, col1 varchar, 
col2 varchar, col3 bigint, col4 bigint, primary key (primary_key)); 

create index on table1(col3); 

मैं एक अतिरिक्त स्तंभ के लिए प्राथमिक कुंजी बदल (मैं अपने आवेदन के अंदर कुंजी गणना) अधिकतर प्रयुक्त क्वेरी की तरह कुछ है ।

select * from table1 where col3 < 100 and col3 > 50; 

यह परिणाम है:: कुछ रिकॉर्ड आयात करने के बाद मैं cql निम्नलिखित को निष्पादित करने की कोशिश की

Bad Request: No indexed columns present in by-columns clause with Equal operator 

क्वेरी col1, col2, col3, col4 table1 से चयन जहां col3 = 67 काम करता है

Google ने कहा कि इस तरह के प्रश्नों को निष्पादित करने का कोई तरीका नहीं है। क्या वह सही है? कोई सलाह कैसे ऐसी क्वेरी बनाने के लिए?

उत्तर

6

कैसंड्रा इंडेक्स वास्तव में अनुक्रमिक पहुंच का समर्थन नहीं करते हैं; http://www.datastax.com/docs/1.1/ddl/indexes देखें कि वे कहां उपयोगी हैं, इसकी एक अच्छी त्वरित व्याख्या के लिए। लेकिन निराशा मत करो; कैसंद्रा (और कई अन्य नोएसक्यूएल सिस्टम) का उपयोग करने का अधिक शास्त्रीय तरीका denormalize, denormalize, denormalize है।

यह अपने मामले क्लासिक बाल्टी दूरी पैटर्न है, जो आप की सिफारिश की RandomPartitioner उपयोग करें और अपनी पंक्तियों में अच्छी तरह से, अपने क्लस्टर चारों ओर वितरित जबकि अभी भी अपने मूल्यों के लिए अनुक्रमिक पहुंच की अनुमति देते रखने की सुविधा देता का उपयोग करने के एक अच्छा विचार हो सकता है। इस मामले में विचार यह है कि आप एक दूसरे गतिशील कॉलमफैमिली मैपिंग (बाल्टी और ऑर्डर) col3 संबंधित primary_key मानों पर वापस मूल्य बनाएंगे। उदाहरण के तौर पर, यदि आपके col3 मान 0 से 10^9 तक हैं और काफी समान रूप से वितरित किए जाते हैं, तो आप उन्हें 10^6 रेंज के 1000 बाल्टी में रखना चाहते हैं (ग्रैन्युलरिटी का सर्वोत्तम स्तर आपको प्रश्नों के प्रकार पर निर्भर करेगा जरूरत है, आपके पास डेटा का प्रकार, राउंड-ट्रिप टाइम पूछताछ आदि)। cql3 के लिए उदाहरण स्कीमा:

CREATE TABLE indexotron (
    rangestart int, 
    col3val int, 
    table1key varchar, 
    PRIMARY KEY (rangestart, col3val, table1key) 
); 

जब table1 में डालने, आप एक इसी पंक्ति indexotron में rangestart = int(col3val/1000000) साथ सम्मिलित करना चाहिए। फिर जब आपको कॉल 3> एक्स के साथ table1 में सभी पंक्तियों की गणना करने की आवश्यकता है, तो आपको indexotron की 1000 बाल्टी तक पूछताछ करने की आवश्यकता है, लेकिन सभी col3val एस को क्रमबद्ध किया जाएगा।उदाहरण क्वेरी सभी table1.primary_key मूल्यों को खोजने के लिए जो table1.col3 < 4021:

SELECT * FROM indexotron WHERE rangestart = 0 ORDER BY col3val; 
SELECT * FROM indexotron WHERE rangestart = 1000 ORDER BY col3val; 
SELECT * FROM indexotron WHERE rangestart = 2000 ORDER BY col3val; 
SELECT * FROM indexotron WHERE rangestart = 3000 ORDER BY col3val; 
SELECT * FROM indexotron WHERE rangestart = 4000 AND col3val < 4021 ORDER BY col3val; 
+0

'चयन गिनती (*)' उपयोगी भी हो सकता है, FWIW ... – rogerdpack

0

col3 हमेशा छोटे मान/पर्वतमाला में जाना जाता है, तो आप एक सरल तालिका भी प्रारंभिक तालिका पर वापस नक्शे के साथ भाग प्राप्त करने में सक्षम हो सकता है, उदाहरण के लिए:

create table table2 (col3val int, table1key varchar, 
    primary key (col3val, table1key)); 

और प्रयोग

insert into table2 (col3val, table1key) values (55, 'foreign_key'); 
insert into table2 (col3val, table1key) values (55, 'foreign_key3'); 
select * from table2 where col3val = 51; 
select * from table2 where col3val = 52; 
... 

हो सकता है कि ठीक है अगर आप पर्वतमाला की बहुत बड़ी नहीं है। (आप अपने माध्यमिक सूचकांक के साथ भी वही प्रभाव प्राप्त कर सकते हैं, लेकिन माध्यमिक अनुक्रमणिका की अत्यधिक अनुशंसा नहीं की जाती है?)। सैद्धांतिक रूप से इसे "क्लाइंट साइड पर स्थानीय रूप से समानांतर" समझा सकता है।

ऐसा लगता है कि "कैसंड्रा रास्ता" कुछ "उपयोगकर्ता आईडी" की तरह है और आप इसे "अपने सभी प्रश्नों" के पहले भाग के रूप में उपयोग करते हैं, इसलिए आपको अपने डेटा मॉडल पर पुनर्विचार करने की आवश्यकता हो सकती है, तो आपके पास प्रश्न हो सकते हैं select * from table1 where userid='X' and col3val > 3 और यह work (कॉल 3val पर क्लस्टरिंग कुंजी मान रहा है)।