Mempercepatkan Pengiraan Baris dalam MySQL untuk Keputusan Pantas
Mengira baris dalam jadual MySQL yang besar boleh menjadi tugas yang memakan masa. Ini benar terutamanya apabila jadual mengandungi berjuta-juta baris. Pertanyaan SELECT COUNT(*) standard boleh mengambil masa beberapa saat untuk diselesaikan, yang boleh menjadi kesesakan prestasi yang ketara.
Mengapa Indeks Mungkin Tidak Membantu
Menambahkan indeks pada lajur yang diindeks selalunya boleh meningkatkan prestasi pertanyaan. Walau bagaimanapun, dalam kes mengira baris, indeks mungkin tidak memberikan faedah yang ketara. Ini kerana pertanyaan masih perlu mengimbas setiap baris dalam jadual untuk menentukan kiraan baris.
Teknik Alternatif
Selain daripada menyimpan cache atau mengemas kini maklumat ringkasan, terdapat teknik terhad untuk mempercepatkan pertanyaan pengiraan baris. Satu penyelesaian yang berpotensi ialah menggunakan enjin storan berasaskan lajur, seperti Apache Parket. Enjin berasaskan lajur direka untuk pertanyaan analitikal dan boleh menjadi lebih pantas untuk jenis pertanyaan tertentu, termasuk pengiraan baris. Walau bagaimanapun, enjin berasaskan lajur mungkin tidak sesuai untuk semua kes penggunaan dan mungkin mempunyai kelemahan untuk jenis pertanyaan lain.
Jadual Ringkasan Berasaskan Pencetus
Cara yang paling berkesan untuk mempercepatkan pertanyaan pengiraan baris adalah dengan mengekalkan jadual ringkasan. Jadual ringkasan ini boleh menyimpan kiraan baris untuk setiap nilai yang mungkin bagi lajur yang diindeks. Apabila baris disisipkan, dipadamkan atau dikemas kini, pencetus boleh mengemas kini jadual ringkasan dengan sewajarnya. Pendekatan ini boleh memberikan pertanyaan kiraan baris yang hampir serta-merta, tanpa mengira saiz jadual.
Berikut ialah contoh jadual ringkasan berasaskan pencetus:
CREATE TABLE books_cnt ( status VARCHAR(255) NOT NULL, total INT NOT NULL ); CREATE TRIGGER ai_books AFTER INSERT ON books FOR EACH ROW UPDATE books_cnt SET total = total + 1 WHERE status = NEW.status; CREATE TRIGGER ad_books AFTER DELETE ON books FOR EACH ROW UPDATE books_cnt SET total = total - 1 WHERE status = OLD.status; CREATE TRIGGER au_books AFTER UPDATE ON books FOR EACH ROW BEGIN IF (OLD.status <> NEW.status) THEN UPDATE books_cnt SET total = total + IF(status = NEW.status, 1, -1) WHERE status IN (OLD.status, NEW.status); END IF; END;
Dengan menggunakan pencetus ini -berasaskan jadual ringkasan, anda boleh mendapatkan semula kiraan baris untuk setiap nilai status dengan pertanyaan mudah:
SELECT status, total FROM books_cnt;
Ini pertanyaan akan mengembalikan hasil serta-merta, walaupun untuk jadual besar.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mempercepatkan Pengiraan Baris dalam MySQL untuk Peningkatan Prestasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!