Saya sedang mengusahakan program laman web, dan keperluan umum adalah seperti berikut.
Pengguna dibahagikan kepada lima tahap, 1-5 Lebih besar bilangannya, lebih tinggi kuasa.
Saya mempunyai banyak kandungan Lebih tinggi tahap, lebih banyak kandungan dapat dilihat oleh pengguna.
Sebagai contoh, terdapat kandungan: A, B, C, D, E,
Kelihatan kepada kumpulan pengguna 1: A
Kelihatan kepada kumpulan pengguna 2: A, B
…………
Kelihatan kepada kumpulan pengguna 5: A, B, C , D, E
Jika anda ingin melaksanakan fungsi ini, bagaimanakah anda harus membina indeks pangkalan data?
Seorang rakan memberitahu saya untuk menambah lajur "kumpulan" pada jadual kandungan (topik),
tulis tahap pengguna yang boleh dilihat 1-5, dan kemudian buat group_tid
的联合索引。
然后查询tid
<100周围文章(例如当前用户组为3)时的语句就是:
SELECT * FROM topic
WHERE group
>=3 AND tid
<100 LIMIT 10;
可实际发现这种索引是先将group
>3的所有数据读出来,再进行选择查询。
假如有100万条数据,有50万个group
indeks bersama.
tid
<100 (contohnya, kumpulan pengguna semasa ialah 3): SELECT * FROM topic
WHERE group
>=3 AND tid
<100 LIMIT 10;
Sebenarnya boleh didapati bahawa indeks jenis ini mula-mula membaca semua data
>3, dan kemudian melakukan pertanyaan pemilihan.
>3, pelaksanaan kenyataan ini akan menapis 500,000 jenis, yang sangat tidak cekap.
Nampaknya indeks lajur tunggal hanya digunakan pada sekatan seperti group_tid
=*, bukan <
Jadi saya ingin bertanya kepada pakar di sini, pernahkah anda mempunyai keperluan yang serupa? Bagaimana untuk membuat indeks atau jadual dengan betul? Terima kasih banyak-banyak!
Tambahan 1:
Ini soalan logik group
进行了范围限制,后面的tid
还是在group
的基础上按顺序排列的。
如果我想知道group
>1且tid
<6的这种情况,不得不先把group
indeks semasa adalah serupa dengan gambar di bawah selepas ia ditubuhkan:
Walaupun saya mengehadkan julat
, tid
berikut masih disusun mengikut tertib berdasarkan group
=1,tid
=Agroup
=2,tid
=Agroup
=3,tid
=A
这样在内容读取时直接请求WHERE group
.
Jika saya ingin tahu situasi di mana
tid
<6, saya perlu membaca semua 🎜2/3 dahulu dan kemudian menapis. 🎜Nampaknya satu-satunya penyelesaian ialah merancang semula struktur meja Adakah anda mempunyai pengalaman yang sama? 🎜
🎜Supplement 2: 🎜Saya baru sahaja menerima jawapan yang berguna daripada seorang rakan yang bersemangat, mengatakan bahawa dia pernah menghadapi situasi ini sebelum ini. 🎜Penyelesaian adalah untuk mengubah suai mekanisme penerbitan dan menerbitkan jawatan yang layak ke setiap peringkat. 🎜Sebagai contoh, jika tahap kandungan A ialah 3, maka tiga baris data mesti dibuat pada masa yang sama semasa menyiarkan: 🎜🎜=1,tid
=A🎜🎜=2, tid
=A 🎜🎜=3,tid
=A🎜Dengan cara ini, kandungan yang layak boleh dibaca dengan meminta terus WHERE 🎜=* semasa membaca kandungan. 🎜Tetapi kaedah ini memerlukan penambahan sejumlah besar data yang berkaitan, malah boleh menyebabkan pertindihan Adakah terdapat penyelesaian lain? 🎜
Sebenarnya, idea anda sudah betul.
Buat indeks pada tid dan bahagikan jadual mengikut kumpulan.
Jika kumpulan >= 3 kumpulan, gabungkan SQL secara dinamik dalam program seperti berikut:
Indeks di atas berkesan dan logiknya tersedia.
Pertama sekali, izinkan saya menerangkan bahawa dalam Innodb, sama ada indeks berkuat kuasa atau tidak tiada kaitan dengan penggunaan < atau >. Ia tidak bermakna bahawa menggunakan = pasti akan membolehkan anda menggunakan indeks. Apabila prestasi pertanyaan jadual penuh lebih tinggi daripada pertanyaan dapatkan semula indeks, MySQL akan secara bijak meninggalkan indeks dan memilih pertanyaan jadual penuh.
Seperti yang ditunjukkan dalam gambar:
Berbalik kepada soalan anda, jika julat yang diambil oleh indeks, seperti tid<100, agak kecil, indeks boleh digunakan.
Jika set hasil kedua-dua indeks ini besar, sekiranya anda mempertimbangkan untuk menambah syarat penapisan lain, seperti hanya mencari kandungan pada bulan lalu berdasarkan masa pembuatan.
Isu penomboran juga boleh ditapis semula dengan ID kunci utama.
Pertama sekali, anda perlu memahami perkara berikut:
Untuk pertanyaan pada jadual, paling banyak hanya satu indeks digunakan setiap kali
Untuk indeks bersama, data ditapis dari kiri ke kanan, jadi jika keadaan penapis pertama menyasarkan lebih daripada atau kurang daripada, keadaan penapis kedua tidak akan mempunyai julat indeks yang tepat di seluruh kawasan pilihan data ditapis keluar oleh penapis pertama
Struktur indeks B-Tree adalah serupa dengan struktur pokok, seperti yang ditunjukkan dalam rajah di bawah Indeks sendi diambil dari kiri ke kanan Proses mencari cabang dari atas ke bawah dalam struktur ini
Kemudian kembali kepada soalan anda, jika anda ingin meningkatkan kecekapan dengan sangat baik, maka langkah pertama pengindeksan bersama perlu mengurangkan dengan ketara jumlah data yang boleh digunakan untuk pemeriksaan seterusnya, jadi jika anda ingin menyemak.
tid < 100
的话,先用tid
筛选才能够大幅度减少后续的B-Tree索引分支,所以如果要用联合索引,则应该是(tid, group)
Prestasi penapisan keadaan kumpulan sangat lemah, dan tidak masuk akal untuk mencipta indeks sahaja.
Mengikut senario yang anda gambarkan, selagi nilai tid tidak terlalu besar (dalam susunan ribuan), ia sudah cukup untuk mencipta indeks untuk tid.
Jika anda masih bimbang tentang jumlah besar data yang ditapis mengikut keadaan pasang surut, anda boleh membuat indeks gabungan tid dan kumpulan.
Pertama sekali, terima kasih banyak atas perhatian dan jawapan anda kepada soalan saya! !
mengambil 10 artikel setiap satu mengikut julatSelepas menyelesaikan masalah, saya mempunyai beberapa pemikiran tentang cadangan boxsnake, dan saya akan menyiarkannya di sini.
group_tid
Kaedah pengindeksan ini bukan sahaja dapat menyelesaikan masalah membaca, tetapi juga menyelesaikan masalah paginggroup_tid
这种索引方式除了解决读取之外还能解决分页问题,例如我每页文章数量是10,用户级别为3,那么读取时分别从group1、group2、group3中,
按范围
tid
Sebagai contoh, jika bilangan artikel setiap halaman ialah 10 dan tahap pengguna ialah 3, maka apabila. membaca, ia akan daripada kumpulan1, kumpulan2, Dalam kumpulan3,tid
<100 Walaupun tiada keputusan yang memenuhi syarat dalam kumpulan tertentu, jumlah beberapa item boleh merangkumi kesemuanya.tid_group
这种索引方式来读取,如果需要group<=3的情况,我不知道该取多少篇文章。比方说取10篇,tid90-tid99,如果他们的group都是4,那么就无法取出符合条件的数值。
而
tid_group
在限定group
之前又必须对tid
Tetapi jika anda menggunakan kaedah indekstid_group
untuk membaca, jika kumpulanSebagai contoh, jika anda mengambil 10 artikel, tid90-tid99, jika kumpulan mereka semuanya 4, maka anda tidak boleh mendapatkan nilai yang memenuhi syarat. 🎜Dantid_group
mesti mengehadkantid
sebelum mengehadkangroup
, jadi ia tidak boleh digunakan. 🎜