Meminta nasihat tentang masalah indeks kumpulan jadual mysql
迷茫
迷茫 2017-06-28 09:22:55
0
5
842

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万个groupindeks bersama.

Kemudian tanyakan artikel di sekitar 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.

Jika terdapat 1 juta keping data dan 500,000

>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:

Sebenarnya, mari kita ubah soalan, iaitu cara menggunakan < atau >

Ini soalan logik group进行了范围限制,后面的tid还是在group的基础上按顺序排列的。
如果我想知道group>1且tid<6的这种情况,不得不先把groupindeks semasa adalah serupa dengan gambar di bawah selepas ia ditubuhkan:




Walaupun saya mengehadkan julat
, tid berikut masih disusun mengikut tertib berdasarkan group=1,tid=A
group=2,tid=A
group=3,tid=A
这样在内容读取时直接请求WHERE group.
Jika saya ingin tahu situasi di mana

>1 dan 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? 🎜
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(5)
学习ing

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:

select * from group3 where tid < 100
union all 
select * from group4 where tid < 100
union all 
select * from group5 where tid < 100

Indeks di atas berkesan dan logiknya tersedia.

ringa_lee

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:

  1. Untuk pertanyaan pada jadual, paling banyak hanya satu indeks digunakan setiap kali

  2. 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

  3. 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

  4. Mekanisme indeks hanyalah untuk mencipta jadual yang sepadan daripada nilai ke item data, supaya anda boleh dengan cepat mencari nilai tertentu dalam medan tertentu ke baris tertentu, menghapuskan keperluan untuk menjalankan keseluruhan jadual untuk mencari yang sepadan baris, jadi bandingkan Cepat

B-Tree struktur indeks:


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! !
Selepas 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 paging group_tid这种索引方式除了解决读取之外还能解决分页问题,
例如我每页文章数量是10,用户级别为3,那么读取时分别从group1、group2、group3中,
按范围tidSebagai contoh, jika bilangan artikel setiap halaman ialah 10 dan tahap pengguna ialah 3, maka apabila. membaca, ia akan daripada kumpulan1, kumpulan2, Dalam kumpulan3,

mengambil 10 artikel setiap satu mengikut julat 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之前又必须对tidTetapi jika anda menggunakan kaedah indeks tid_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. 🎜Dan tid_group mesti mengehadkan tid sebelum mengehadkan group, jadi ia tidak boleh digunakan. 🎜

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan