Persediaan Temu Duga SQL · Pelajaran

Imbasan Berjujukan berbanding Imbasan Indeks berbanding Indeks Sahaja

Sebab perancang memilih setiap satunya dan perkara yang didedahkannya tentang pertanyaan anda.

Pelajaran 2 daripada 413 langkah

Imbasan Berjujukan berbanding Imbasan Indeks berbanding Indeks Sahaja ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Tiga Cara Membaca Jadual

Apabila perancang memerlukan baris daripada jadual, perancang memilih salah satu daripada tiga kaedah capaian, dan penemuduga mengharapkan anda menamakan ketiga-tiganya:

  • Imbasan Berjujukan, membaca setiap baris dalam jadual dari awal hingga akhir.
  • Imbasan Indeks, menelusuri indeks untuk mencari baris yang sepadan, kemudian mengambil setiap baris daripada jadual.
  • Imbasan Indeks Sahaja, menjawab sepenuhnya daripada indeks tanpa menyentuh jadual langsung.

Mengetahui sebab perancang memilih setiap kaedah ialah teras pelajaran ini dan soalan lazim untuk calon berpengalaman.

Cara Imbasan Berjujukan Berfungsi

Imbasan Berjujukan membaca halaman jadual satu demi satu dan menggunakan sebarang penapis pada setiap baris. Tiada indeks digunakan.

Ini kedengaran buruk, tetapi selalunya merupakan pilihan yang tepat. Bacaan berjujukan pantas untuk cakera kerana tiada lompatan rawak. Oleh itu, apabila pertanyaan mengembalikan sebahagian besar jadual, membaca semuanya lebih baik daripada melompat melalui indeks berjuta-juta kali.

Contohnya: imbas orders dan kekalkan baris yang amount > 100. Jika kebanyakan pesanan melebihi 100, imbasan berjujukan ialah pilihan yang betul.

EXPLAIN SELECT * FROM orders WHERE amount > 100;

Seq Scan on orders  (cost=0.00..18334.00 rows=900000 width=64)
  Filter: (amount > 100)

Cara Imbasan Indeks Berfungsi

Imbasan Indeks menggunakan pepohon B untuk melompat terus kepada kekunci yang sepadan, kemudian membaca baris yang berkaitan daripada timbunan jadual.

Kaedah ini cemerlang apabila penapis itu selektif dan hanya mengembalikan sebahagian kecil jadual. Mencari 5 baris melalui indeks lebih baik daripada membaca 10 juta baris.

Pelan menamakan indeks yang digunakannya. Setiap padanan memerlukan satu carian indeks serta satu pengambilan daripada timbunan (bacaan rawak), jadi imbasan indeks kehilangan kelebihannya apabila mengembalikan terlalu banyak baris.

EXPLAIN SELECT * FROM orders WHERE customer_id = 42;

Index Scan using idx_orders_customer on orders
  (cost=0.42..38.50 rows=12 width=64)
  Index Cond: (customer_id = 42)

Selektiviti Menentukan Pilihan

Konsep tunggal yang mendorong semua perkara ini ialah selektiviti: pecahan baris yang dikekalkan oleh sesuatu predikat.

  • Selektiviti tinggi (sedikit baris sepadan, seperti id unik) memihak kepada Imbasan Indeks.
  • Selektiviti rendah (banyak baris sepadan, seperti status IS NOT NULL) memihak kepada Imbasan Berjujukan.

Peraturan umum yang biasa digunakan: apabila pertanyaan mengembalikan lebih kurang 5 hingga 10 peratus daripada sesebuah jadual, perancang selalunya memilih imbasan berjujukan kerana pengambilan timbunan secara rawak melalui indeks menjadi lebih mahal daripada membaca semuanya mengikut susunan.

Imbasan Indeks Sahaja

Imbasan Indeks Sahaja ialah yang terpantas antara ketiga-tiganya. Jika setiap lajur yang diperlukan oleh pertanyaan sudah berada dalam indeks, enjin tidak perlu menyentuh timbunan jadual langsung.

Pertanyaan contoh hanya memilih customer_id dan menapis berdasarkan lajur itu, manakala indeksnya adalah pada customer_id. Semua data yang diperlukan berada dalam indeks, jadi Postgres melaporkan Imbasan Indeks Sahaja.

Kaedah ini mengelakkan bacaan timbunan secara rawak yang melambatkan imbasan indeks biasa, suatu kelebihan besar pada jadual dengan baris yang lebar.

EXPLAIN SELECT customer_id FROM orders WHERE customer_id = 42;

Index Only Scan using idx_orders_customer on orders
  (cost=0.42..8.44 rows=12 width=4)
  Index Cond: (customer_id = 42)

Nuansa Peta Keterlihatan

Penemuduga sangat menyukai nuansa ini. Imbasan indeks sahaja masih perlu mengesahkan bahawa setiap baris kelihatan kepada transaksi anda (MVCC), dan indeks sahaja tidak menyimpan maklumat keterlihatan.

Postgres menggunakan peta keterlihatan: jika halaman ditandai sebagai kelihatan sepenuhnya, timbunan dilangkau; jika tidak, baris daripada timbunan tetap perlu diambil. Pelan menunjukkan Heap Fetches: N.

Itulah sebabnya jadual yang baru dikemas kini boleh menunjukkan banyak pengambilan timbunan dan melambatkan imbasan indeks sahaja sehingga VACUUM menyegarkan peta keterlihatan.

Index Only Scan using idx_orders_customer on orders
  (actual time=0.01..0.03 rows=12 loops=1)
  Heap Fetches: 0

Imbasan Peta Bit: Jalan Tengah

Terdapat kaedah keempat yang sering muncul: Imbasan Timbunan Peta Bit. Perancang memilihnya apabila predikat sepadan dengan lebih banyak baris daripada yang sesuai untuk imbasan indeks biasa tetapi lebih sedikit daripada seluruh jadual.

Mula-mula, kaedah ini membina peta bit lokasi baris yang sepadan daripada indeks (Imbasan Indeks Peta Bit), kemudian mengambil halaman timbunan dalam susunan fizikal, bukannya susunan rawak. Pengambilan mengikut susunan jauh lebih murah daripada bacaan berselerak bagi imbasan indeks biasa.

Bitmap Heap Scan on orders  (cost=12.0..520.0 rows=8000)
  Recheck Cond: (status = 'pending')
  ->  Bitmap Index Scan on idx_orders_status
        (cost=0..12 rows=8000)
        Index Cond: (status = 'pending')

Mengapa Perancang Mengabaikan Indeks Anda

Soalan temu duga yang klasik: Saya menambah indeks tetapi pelan masih melakukan Imbasan Berjujukan; mengapa? Sebab yang biasa termasuk:

  • Predikat itu tidak selektif; imbasan sememangnya lebih murah.
  • Fungsi membalut lajur: WHERE lower(email) = ... tidak boleh menggunakan indeks biasa pada e-mel.
  • Ketidakpadanan jenis memaksa penukaran jenis tersirat yang menyebabkan indeks tidak dapat digunakan.
  • Statistik sudah lapuk; jalankan ANALYZE.
  • Jadual itu sangat kecil; mengimbas beberapa halaman lebih baik daripada kos tambahan indeks.

Diagnosis Berdasarkan Contoh

Andaikan orders mempunyai indeks pada created_at tetapi pertanyaan ini masih melakukan imbasan berjujukan:

Puncanya ialah DATE(created_at). Membalut lajur dengan fungsi bermakna indeks pada created_at mentah tidak boleh digunakan. Penyelesaiannya adalah dengan menulis semula pertanyaan sebagai predikat julat yang membiarkan lajur tanpa pembalut, atau membina indeks ungkapan pada DATE(created_at).

-- Slow: function on the indexed column
WHERE DATE(created_at) = '2026-01-01'

-- Fast: bare column, range uses the index
WHERE created_at >= '2026-01-01'
  AND created_at <  '2026-01-02'

Membandingkan Kaedah

Ingat perbandingan ini untuk temu duga:

  • Imbasan Berjujukan, terbaik apabila mengembalikan sebahagian besar baris; input/output berjujukan.
  • Imbasan Indeks, terbaik untuk carian selektif; penelusuran indeks serta pengambilan timbunan secara rawak.
  • Imbasan Timbunan Peta Bit, untuk bilangan padanan pertengahan; indeks kepada peta bit, kemudian bacaan timbunan mengikut susunan.
  • Imbasan Indeks Sahaja, terpantas apabila indeks merangkumi setiap lajur yang diperlukan dan semua halaman kelihatan.

Perancang memilih berdasarkan kos anggaran, yang didorong terutamanya oleh selektiviti dan statistik.

Memaksa Ujian (dan Sebabnya Bukan dalam Produksi)

Untuk membuktikan sesuatu perkara dalam pembangunan, anda boleh mengubah hala perancang buat sementara waktu: SET enable_seqscan = off; memaksanya mengutamakan indeks supaya anda boleh membandingkan pelan.

Ini ialah helah diagnostik, bukannya pembaikan untuk produksi. Nyatakan dalam temu duga bahawa penyelesaian sebenar ialah statistik yang lebih baik, indeks yang sesuai atau penulisan semula predikat, bukannya menyahaktifkan ciri perancang secara menyeluruh.

SET enable_seqscan = off;
EXPLAIN ANALYZE SELECT * FROM orders WHERE amount > 100;
SET enable_seqscan = on;

Semakan Pantas

Sesuatu pertanyaan hanya memilih email dan menapis berdasarkan email, manakala terdapat indeks pepohon B pada email. Pelan menunjukkan Index Only Scan. Mengapakah kaedah ini lebih pantas daripada Imbasan Indeks biasa?

Ringkasan

Inti pati utama tentang kaedah capaian:

  • Imbasan Berjujukan unggul untuk pertanyaan yang mempunyai selektiviti rendah; Imbasan Indeks unggul untuk pertanyaan yang selektif.
  • Imbasan Indeks Sahaja mengelakkan timbunan apabila indeks merangkumi semua lajur yang diperlukan; perhatikan Heap Fetches dan peta keterlihatan.
  • Imbasan Timbunan Peta Bit mengisi ruang pertengahan dengan mengambil halaman timbunan mengikut susunan fizikal.
  • Perancang membuat keputusan berdasarkan selektiviti dan statistik; fungsi pada lajur, ketidakpadanan jenis dan statistik lapuk menyebabkan indeks diabaikan.
Percuma untuk bermula

Pelajari SQL dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
30
Pelajaran
120

Soalan Lazim

Adakah pelajaran “Imbasan Berjujukan berbanding Imbasan Indeks berbanding Indeks Sahaja” percuma?

Ya — teks penuh “Imbasan Berjujukan berbanding Imbasan Indeks berbanding Indeks Sahaja” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Imbasan Berjujukan berbanding Imbasan Indeks berbanding Indeks Sahaja”?

Sebab perancang memilih setiap satunya dan perkara yang didedahkannya tentang pertanyaan anda. Anda berlatih Persediaan Temu Duga SQL menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga SQL?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Imbasan Berjujukan berbanding Imbasan Indeks berbanding Indeks Sahaja” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga SQL ini?

Ya. Setiap pelajaran Persediaan Temu Duga SQL menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Membaca Pelan EXPLAIN
  2. Imbasan Berjujukan berbanding Imbasan Indeks berbanding Indeks Sahaja
  3. Algoritma Cantuman: Gelung Bersarang, Cincangan, Cantum
  4. Mengesan dan Membetulkan Pertanyaan Perlahan
← Kembali ke Persediaan Temu Duga SQL