บางทีคุณควรรวมสองวิธีเข้าด้วยกัน ทำไม ???
ลองใช้ตารางนั้น (ภาษาถิ่นของ MySQL)
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);
หากจำนวนรหัสใน mytomb มากกว่า 5% ของจำนวนแถวของ mydata แสดงว่าเป็นการสแกนแบบเต็มตาราง มิฉะนั้นการสแกนดัชนีพร้อมการค้นหาแต่ละแถว บันทึกมาตรฐานใด ๆ ในส่วนนี้ ค้นหาแผนการอธิบาย
ตอนนี้คุณต้องการเห็นทุกคนในรหัสไปรษณีย์ 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;
สรุปผลการศึกษา
ตอนนี้ฉันไม่ได้บอกว่าจะรักษาทั้งสองวิธี การทำเช่นนี้เมื่อเวลาผ่านไปเผยให้เห็นว่าวิธีใดจะเร็วกว่าในแง่ของการใช้งานโดยรวม คุณต้องตัดสินใจว่าเกณฑ์มาตรฐานสำหรับการสอบถามข้อมูลสดการสืบค้นข้อมูลที่ถูกลบและการลบแบบจำนวนมากทำงานได้ดีที่สุดสำหรับคุณ