2013-07-22 5 views
5

मैं दो तालिकाओं है:विदेशी कुंजी या प्राथमिक कुंजी द्वारा समूह?

user 
======= 
id 
name 
class 

marks 
======= 
id 
user_id 
sub_id 
mark 

उपयोगकर्ता तालिका उपयोगकर्ता (छात्र) का विवरण होता है अंक तालिका विषय आईडी के साथ विभिन्न विषयों में एक छात्र

मैं नाम लाने के लिए चाहते हैं के निशान होते हैं, वर्ग और इन तालिकाओं से कुल अंक।

1. SELECT name, class, SUM(mark) AS total FROM user 
    LEFT JOIN marks ON marks.user_id = user.id 
    GROUP BY marks.user_id 
    ///Here in GROUP BY I have used foreign key (marks.user_id) 

2. SELECT name, class, SUM(mark) AS total FROM user 
    LEFT JOIN marks ON marks.user_id = user.id 
    GROUP BY user.id 
    ///Here in GROUP BY I have used primary key (user.id) 

दोनों देता है मुझे डेटा की आवश्यकता:

मैं दो प्रश्न हैं। मेरा सवाल है कि मुझे किस का उपयोग करना चाहिए?

क्या कोई नियम है जो कहता है कि आपको समूह में प्राथमिक कुंजी या समूह में विदेशी कुंजी का उपयोग करना चाहिए या ऐसा कुछ?

+1

क्वेरी को चलाने का प्रयास करें जो 'user.id' के पास' marks.user_id' के लिए कोई मिलान मान नहीं है। और देखें कि क्या होता है .. –

+2

दोनों प्रश्नों के बारे में 'स्पष्टीकरण' क्या कहता है? –

+0

@ 491243: मुझे यह जांचने दो। –

उत्तर

3

आपको प्राथमिक कुंजी द्वारा 2 संस्करण समूहिंग का उपयोग करना चाहिए। आम तौर पर मुख्य तालिका के कॉलम (ओं) के आधार पर बयान द्वारा क्रम और समूह होना बेहतर होता है और शामिल नहीं होते हैं। यदि आप शामिल टेबल कॉलम पर ऑर्डर या समूह करते हैं तो MySQL को अस्थायी टेबल बनाना होता है जो आपके डेटासाइज पर आधारित डिस्क आसानी से जा सकता है और महत्वपूर्ण प्रदर्शन बाधा को समाप्त कर सकता है।

भागो इन दोनों क्वेरी के लिए बताते हैं देखने के लिए मैं क्या बात कर रहा था:

EXPLAIN SELECT name, SUM(mark) AS total FROM users 
    LEFT JOIN marks ON marks.user_id = users.id 
    GROUP BY marks.user_id; 

EXPLAIN SELECT name, SUM(mark) AS total FROM users 
    LEFT JOIN marks ON marks.user_id = users.id 
    GROUP BY users.id; 

ही यहां पाया जा सकता: http://sqlfiddle.com/#!2/a8ece/6

+0

धन्यवाद मुझे लगता है कि यह वह जवाब है जिसे मैं चाहता था। :) –

0

क्योंकि प्राथमिक कुंजी अद्वितीय अनुक्रमणिका है। (प्राथमिक कुंजी) द्वारा समूह

अपने परिणाम में लाइन की संख्या कम नहीं

इसलिए मुझे लगता है कि आप

6

को देखते हुए यदि आप बाईं किया है में शामिल होने का उपयोग करना चाहिए (विदेशी कुंजी) द्वारा समूह उपयोग कर सकते हैं Marks.user_id के रूप में दूसरी क्वेरी शून्य हो सकती है

+0

पर वापस ले जाऊंगा और क्या होगा यदि marks.user_id शून्य नहीं है। मैं प्रदर्शन के बारे में बात कर रहा हूं, जब मेरे पास एक बड़ा डेटा होगा। –

2

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

1

जब मैं निम्नलिखित एसक्यूएल भाग गया:

DESCRIBE SELECT name, class, SUM(mark) AS total FROM user 
LEFT JOIN marks ON marks.user_id = user.id 
GROUP BY marks.user_id; 

MySQL ने कहा कि यह उपयोगकर्ता तालिका के लिए फाइलॉर्ट का उपयोग करता है और तालिका के लिए कोई चाबी का उपयोग नहीं किया गया है, और जब मैंने निम्न चलाया:

DESCRIBE SELECT name, class, SUM(mark) AS total FROM user 
LEFT JOIN marks ON marks.user_id = user.id 
GROUP BY user.id; 

अब MySQL ने कहा कि यह दोनों तालिकाओं (फाइलों का उपयोग करने के बजाय) के लिए कुंजी का उपयोग करता है। इस प्रकार मुझे लगता है कि दूसरा, अनुशंसित अभ्यास होना चाहिए क्योंकि फाइलोर्ट प्रदर्शन को कम कर सकता है।

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