हो सकता है कि आपको उद्देश्य पर दो तरीकों को संयोजित करना चाहिए। क्यों ???
आइए उस तालिका का उपयोग करें (MySQL-dialect)
CREATE TABLE mydata
(
id int not null auto_increment
firstname varchar(16) not null,
lastname varchar(16) not null,
zipcode char(5) not null,
...
deleted tinyint not null default 0
KEY (deleted,id),
KEY (deleted,lastname,firstname,id),
KEY (deleted,zipcode,id),
KEY (lastname,firstname),
KEY (zipcode),
PRIMARY KEY (id)
);
कृपया ध्यान दें कि, प्राथमिक कुंजी के अपवाद के साथ, आपके द्वारा बनाया गया प्रत्येक सूचकांक deleted
ध्वज से पहले होना चाहिए और उसके साथ समाप्त होना चाहिए id
।
चलो कब्र की मेज बनाते हैं
CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);
यदि आपकी तालिका में पहले से ही एक deleted
ध्वज है, तो आप tommstone तालिका को पॉप्युलेट कर सकते हैं
INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;
ठीक है अब डेटा और समाधि पूर्वनिर्मित हैं। आप डिलीट कैसे करते हैं?
मान लीजिए कि आप 07305 ज़िपकोड में प्रत्येक व्यक्ति को हटा रहे हैं। आप निम्नलिखित चलाएंगे:
INSERT IGNORE INTO mytomb SELECT id FROM mydata WHERE deleted=0 AND zipcode='07305';
UPDATE mydata SET deleted=1 WHERE deleted=0 AND zipcode='07305';
ठीक है यह ओवरहेड की तरह लगता है जिस तरह से आप इसे देखते हैं।
अब, क्या आप सभी हटाए गए डेटा को देखना चाहते हैं? यहाँ दो अलग-अलग तरीके हैं:
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
यदि मायटॉम्ब में आईडी की संख्या mydata की पंक्ति-पंक्ति के 5% से अधिक है, तो यह पूर्ण तालिका स्कैन है। अन्यथा, प्रत्येक पंक्ति के लुकअप के साथ एक इंडेक्स स्कैन। इन मामलों में किसी भी मानदंड पर ध्यान दें। व्याख्या योजनाओं को देखें।
अब, क्या आप zipcode 07304 में प्रत्येक व्यक्ति को देखना चाहते हैं? यहाँ दो अलग-अलग तरीके हैं:
SELECT * FROM mydata WHERE deleted=1 AND zipcode='07304';
SELECT A.* FROM mydata A LEFT JOIN mytomb B USING (id) WHERE B.id IS NULL AND A.zipcode='07304'
कैसे बड़े पैमाने पर हटाता है? यहाँ दो अलग-अलग तरीके हैं:
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
निष्कर्ष
अब, मैं दोनों विधियों को रखने के लिए नहीं कह रहा हूं। समय के साथ ऐसा करने से पता चलता है कि समग्र परिचालन के संदर्भ में कौन सी विधि तेज है। आपको यह तय करना होगा कि लाइव डेटा को क्वेरी करने, डिलीट किए गए डेटा को क्वेरी करने और बड़े पैमाने पर डिलीट करने के लिए कौन से बेंचमार्क आपके लिए सबसे अच्छा काम करते हैं।