Pangkalan data perhubungan itu sendiri lebih berkemungkinan menjadi kesesakan sistem, dan kapasiti penyimpanan, bilangan sambungan dan keupayaan mesin tunggal adalah terhad. Apabila volum data satu jadual mencapai 1000W atau 100G, disebabkan bilangan dimensi pertanyaan yang banyak, walaupun pangkalan data hamba ditambah dan indeks dioptimumkan, prestasi masih akan menurun dengan teruk apabila melakukan banyak operasi. Pada masa ini, adalah perlu untuk mempertimbangkan membahagikannya. Tujuan pembahagian adalah untuk mengurangkan beban pada pangkalan data dan memendekkan masa pertanyaan.
1000W atau 100G boleh dikatakan sebagai nilai rujukan industri Perincian bergantung kepada kemudahan perkakasan sistem semasa, reka bentuk struktur meja dan faktor lain.
Kandungan teras pengedaran pangkalan data tidak lebih daripada pembahagian data (Sharding
), serta kedudukan dan penyepaduan data selepas pembahagian. Segmentasi data adalah untuk menyimpan data secara berselerak dalam berbilang pangkalan data, menjadikan jumlah data dalam pangkalan data tunggal lebih kecil Dengan memperluaskan bilangan hos, masalah prestasi pangkalan data tunggal dapat dikurangkan, dengan itu mencapai tujuan untuk meningkatkan prestasi operasi pangkalan data.
Segmentasi data boleh dibahagikan kepada dua cara mengikut jenis segmentasinya: segmentasi menegak (menegak) dan segmentasi mendatar (mendatar)
Segmentasi menegak Terdapat dua jenis biasa: sub-perpustakaan menegak dan sub-jadual menegak.
Sharding menegak adalah untuk menyimpan jadual berbeza dengan korelasi rendah dalam pangkalan data berbeza berdasarkan gandingan perniagaan. Pendekatan ini serupa dengan membahagikan sistem besar kepada berbilang sistem kecil, yang dibahagikan secara bebas mengikut klasifikasi perniagaan. Sama seperti pendekatan "tadbir urus perkhidmatan mikro", setiap perkhidmatan mikro menggunakan pangkalan data yang berasingan. Seperti yang ditunjukkan dalam gambar:
Pemisahan jadual menegak adalah berdasarkan "lajur" dalam pangkalan data Jika jadual mempunyai banyak medan, anda boleh membuat jadual sambungan baharu dan membahagikan medan yang tidak kerap digunakan atau mempunyai panjang medan yang besar kepada lanjutan. meja. Apabila terdapat banyak medan (contohnya, jadual besar mempunyai lebih daripada 100 medan), "memecahkan jadual besar kepada jadual kecil" adalah lebih mudah untuk dibangunkan dan diselenggara, dan juga boleh mengelakkan masalah silang halaman Lapisan bawah MySQL adalah disimpan melalui halaman data Rakaman yang mengambil terlalu banyak ruang akan membawa kepada persilangan halaman, menyebabkan overhed prestasi tambahan. Di samping itu, pangkalan data memuatkan data ke dalam memori dalam unit baris, supaya panjang medan dalam jadual lebih pendek dan kekerapan akses lebih tinggi Memori boleh memuatkan lebih banyak data, kadar pukulan lebih tinggi, dan cakera IO adalah dikurangkan, dengan itu meningkatkan prestasi pangkalan data. . data perniagaan yang berbeza, pengembangan, dsb. 3. Dalam senario konkurensi tinggi, segmentasi menegak akan meningkatkan kesesakan IO, sambungan pangkalan data dan sumber perkakasan mesin tunggal ke tahap tertentu
Apabila aplikasi sukar Tidak kira betapa halus segmentasi menegak, atau bilangan baris data selepas pembahagian adalah besar, akan terdapat satu kesesakan prestasi membaca, menulis dan storan pangkalan data Pada masa ini, pembahagian mendatar diperlukan.
Sharding mendatar dibahagikan kepada sharding intra-database dan sub-database sharding Berdasarkan hubungan logik inheren data dalam jadual, jadual yang sama tersebar ke dalam beberapa pangkalan data atau berbilang jadual mengikut keadaan yang berbeza Sahaja sebahagian daripada data disertakan, sekali gus mengurangkan jumlah data dalam satu jadual dan mencapai kesan teragih. Seperti yang ditunjukkan dalam rajah:
1. Tiada kesesakan prestasi yang disebabkan oleh volum data yang berlebihan dan konkurensi yang tinggi dalam satu pangkalan data, yang meningkatkan kestabilan sistem dan kapasiti beban 2. Transformasi sisi aplikasi adalah kecil dan tiada perlu bahagikan modul bisnes
Kelemahan:
1. Sukar untuk memastikan konsistensi urus niaga merentas serpihan 2. Prestasi pertanyaan gabungan silang pangkalan data adalah sukar dan jumlah penyelenggaraan adalah besar muncul dalam pelbagai pangkalan data / jadual, kandungan setiap perpustakaan/jadual adalah berbeza. Beberapa peraturan pemecahan data biasa ialah:
Kelebihan ini adalah:
1 Saiz satu meja boleh dikawal 2. Ia secara semula jadi mudah untuk mengembangkan secara mendatar, anda hanya perlu menambah nod tidak perlu memindahkan data serpihan lain 3. Apabila menggunakan medan serpihan untuk carian julat, serpihan berterusan boleh mencari serpihan dengan cepat untuk pertanyaan pantas, dengan berkesan mengelakkan masalah pertanyaan serpihan.
Kelemahan: Data hotspot menjadi hambatan prestasi. Perkongsian berterusan mungkin mempunyai titik liputan data, seperti serpihan mengikut medan masa Beberapa serpihan menyimpan data dalam tempoh masa terkini dan mungkin kerap dibaca dan ditulis, manakala beberapa serpihan menyimpan data sejarah yang jarang ditanya
: Pemecahan data secara relatifnya, dan ia tidak terdedah kepada titik panas dan kesesakan akses serentak
Keburukan:
1 algoritma cincang yang konsisten Boleh mengelakkan masalah ini dengan lebih baik) 2. Mudah untuk menghadapi masalah kompleks pertanyaan silang serpihan. Sebagai contoh, dalam contoh di atas, jika cusno tidak termasuk dalam keadaan pertanyaan yang kerap digunakan, pangkalan data tidak akan ditempatkan Oleh itu, adalah perlu untuk memulakan pertanyaan kepada empat perpustakaan pada masa yang sama, kemudian menggabungkan data dalam memori. , ambil set minimum dan kembalikan kepada aplikasi Sebaliknya, perpustakaan menjadi seret.
. dan menembusi rangkaian IO dan perkakasan Kesesakan sumber dan bilangan sambungan juga membawa beberapa masalah. Cabaran teknikal dan penyelesaian yang sepadan ini diterangkan di bawah. 1. Masalah ketekalan transaksi Transaksi silang serpihan juga merupakan urus niaga yang diedarkan, dan tiada penyelesaian mudah Secara amnya, "protokol XA" dan "komit dua fasa" boleh digunakan untuk mengendalikannya. Konsistensi akhirnyaReka bentuk anti-paradigma tipikal yang menggunakan ruang untuk masa dan mengelakkan pertanyaan penyertaan untuk prestasi. Contohnya: apabila jadual pesanan menyimpan userId, ia juga menyimpan salinan berlebihan nama pengguna, supaya apabila menanya butiran pesanan, tidak perlu menanyakan "jadual pengguna pembeli".
Walau bagaimanapun, kaedah ini mempunyai senario terpakai yang terhad, dan lebih sesuai untuk situasi di mana terdapat sedikit medan bergantung. Konsistensi data medan berlebihan juga sukar dipastikan Sama seperti contoh jadual pesanan di atas, selepas pembeli mengubah suai Nama pengguna, adakah ia perlu dikemas kini secara serentak dalam pesanan sejarah? Ini juga harus dipertimbangkan bersama-sama dengan senario perniagaan sebenar.
Di peringkat sistem, terdapat dua pertanyaan Hasil pertanyaan pertama memfokuskan pada mencari ID data yang berkaitan, dan kemudian memulakan permintaan kedua berdasarkan ID untuk mendapatkan yang berkaitan. data. Akhir sekali, data yang diperoleh dikumpulkan ke dalam medan.
Dalam pangkalan data relasional, jika anda boleh terlebih dahulu menentukan hubungan antara jadual dan menyimpan rekod jadual yang berkaitan pada serpihan yang sama, maka lebih baik Untuk mengelakkan masalah cantuman rentas serpihan. Dalam kes 1:1 atau 1:n, ia biasanya dibahagikan mengikut kunci utama ID jadual utama. Seperti yang ditunjukkan dalam rajah di bawah:
Dengan cara ini, jadual pesanan pesanan dan jadual butiran pesanan butiran pada Data Node1 boleh sebahagiannya berkaitan dengan pertanyaan melalui orderId, dan perkara yang sama berlaku pada Data Node2.
Apabila menanyakan berbilang pangkalan data merentas nod, masalah seperti hadkan halaman dan susunan mengikut isihan akan berlaku. Paging perlu diisih mengikut medan yang ditentukan Apabila medan pengisihan adalah medan pengisihan, ia menjadi lebih rumit untuk mencari serpihan yang ditentukan; Data perlu diisih dan dikembalikan dalam nod serpihan yang berbeza dahulu, dan kemudian set hasil yang dikembalikan oleh serpihan berbeza diringkaskan dan diisih semula, dan akhirnya dikembalikan kepada pengguna. Seperti yang ditunjukkan dalam gambar:
Gambar di atas hanya mengambil data dari halaman pertama, yang tidak memberi impak yang besar terhadap prestasi. Walau bagaimanapun, jika bilangan halaman yang diperoleh adalah sangat besar, keadaan menjadi lebih rumit, kerana data dalam setiap nod serpihan mungkin rawak Untuk ketepatan pengisihan, N halaman pertama data semua nod perlu diisih dan Digabungkan Akhirnya, Kemudian lakukan pengisihan keseluruhan Operasi sedemikian menggunakan sumber CPU dan memori, jadi semakin besar bilangan halaman, semakin teruk prestasi sistem.
Apabila menggunakan fungsi seperti Max, Min, Sum dan Count untuk pengiraan, anda juga perlu melaksanakan fungsi yang sepadan pada setiap shard terlebih dahulu, kemudian meringkaskan set hasil setiap shard dan mengira sekali lagi, dan akhirnya keputusan kembali. Seperti yang ditunjukkan dalam gambar:
Dalam persekitaran sub-pangkalan data dan sub-jadual, memandangkan data dalam jadual wujud dalam pangkalan data yang berbeza pada masa yang sama, auto- biasa kenaikan nilai kunci primer tidak akan berguna, ID yang dijana oleh pangkalan data partition tertentu tidak boleh dijamin unik di peringkat global. Oleh itu, adalah perlu untuk mereka bentuk kunci utama global secara berasingan untuk mengelakkan pertindihan kunci utama merentas pangkalan data. Terdapat beberapa strategi penjanaan kunci primer biasa:
Borang piawai UUID mengandungi 32 nombor perenambelasan, dibahagikan kepada 5 segmen, 36 aksara dalam bentuk 8-4-4-4-12 , contohnya : 550e8400-e29b-41d4-a716-446655440000
UUID ialah kunci utama, yang merupakan penyelesaian paling mudah Ia dijana secara tempatan, mempunyai prestasi tinggi dan tidak mempunyai penggunaan masa rangkaian. Tetapi kelemahannya juga jelas kerana UUID adalah sangat panjang, ia akan mengambil banyak ruang penyimpanan Selain itu, akan terdapat masalah prestasi apabila membuat indeks sebagai kunci utama dan pertanyaan berdasarkan indeks gangguan UUID akan menyebabkan perubahan kerap dalam lokasi data , mengakibatkan paging.
Cipta jadual jujukan dalam pangkalan data:
CREATE TABLE `sequence` ( `id` bigint(20) unsigned NOT NULL auto_increment, `stub` char(1) NOT NULL default '', PRIMARY KEY (`id`), UNIQUE KEY `stub` (`stub`) ) ENGINE=MyISAM;
Medan rintisan ditetapkan sebagai indeks unik Nilai rintisan yang sama hanya mempunyai satu rekod dalam jadual jujukan dan boleh digunakan untuk berbilang jadual pada masa yang sama. Kandungan jadual jujukan adalah seperti berikut:
+-------------------+------+ | id | stub | +-------------------+------+ | 72157623227190423 | a | +-------------------+------+
Gunakan enjin storan MyISAM dan bukannya InnoDB untuk prestasi yang lebih tinggi. MyISAM menggunakan kunci peringkat jadual, dan membaca serta menulis ke jadual adalah bersiri, jadi tidak perlu risau tentang membaca nilai ID yang sama dua kali semasa bersamaan.
Apabila ID 64-bit yang unik secara global diperlukan, laksanakan:
REPLACE INTO sequence (stub) VALUES ('a'); SELECT LAST_INSERT_ID();
Kedua-dua pernyataan ini berada pada tahap Sambungan pilih lastinsertid() mesti berada di bawah sambungan pangkalan data yang sama seperti ganti ke untuk mendapatkan ID baharu yang baru dimasukkan.
Kelebihan menggunakan replace into dan bukannya insert into ialah ia mengelakkan bilangan baris meja yang terlalu banyak dan tidak memerlukan pembersihan biasa.
Penyelesaian ini agak mudah, tetapi kelemahannya juga jelas: terdapat satu titik masalah dan ia sangat bergantung pada DB Apabila DB tidak normal, keseluruhan sistem tidak akan tersedia. Mengkonfigurasi master-slave boleh meningkatkan ketersediaan, tetapi apabila pangkalan data induk gagal dan menukar master-slave, ketekalan data sukar untuk dijamin dalam keadaan khusus. Di samping itu, kesesakan prestasi terhad kepada prestasi baca dan tulis MySQL tunggal.
Strategi penjanaan kunci utama yang digunakan oleh pasukan flickr adalah serupa dengan penyelesaian jadual jujukan di atas, tetapi lebih baik menyelesaikan masalah titik tunggal dan kesesakan prestasi.
Idea keseluruhan penyelesaian ini adalah untuk mewujudkan lebih daripada 2 pelayan penjana ID global, menggunakan hanya satu pangkalan data pada setiap pelayan dan setiap pangkalan data mempunyai jadual jujukan untuk merekodkan ID global semasa. Saiz langkah pertumbuhan ID dalam jadual ialah bilangan perpustakaan, dan nilai permulaan disusun mengikut urutan, supaya penjanaan ID boleh dicincang ke setiap pangkalan data. Seperti yang ditunjukkan dalam gambar di bawah:
ID dijana oleh dua pelayan pangkalan data dan nilai auto_increment berbeza ditetapkan. Nilai permulaan jujukan pertama ialah 1, dan setiap langkah meningkat sebanyak 2. Nilai permulaan jujukan yang lain ialah 2, dan setiap langkah meningkat sebanyak 2. Akibatnya, ID yang dijana oleh stesen pertama adalah semua nombor ganjil (1, 3, 5, 7...), dan ID yang dijana oleh stesen kedua ialah semua nombor genap (2, 4, 6, 8.. .).
Penyelesaian ini mengagihkan tekanan menjana ID pada kedua-dua mesin secara sama rata. Ia juga menyediakan toleransi kerosakan sistem Jika ralat berlaku pada mesin pertama, ia boleh bertukar secara automatik ke mesin kedua untuk mendapatkan ID. Walau bagaimanapun, ia mempunyai kelemahan berikut: apabila menambah mesin ke sistem, pengembangan mendatar adalah lebih rumit setiap kali ID diperoleh, DB perlu dibaca dan ditulis Tekanan pada DB masih sangat tinggi, dan prestasinya hanya boleh diperbaiki dengan bergantung pada mesin timbunan.
Anda boleh terus mengoptimumkan berdasarkan penyelesaian flickr, menggunakan kaedah kelompok untuk mengurangkan tekanan penulisan pangkalan data, mendapatkan julat segmen nombor ID setiap kali, dan kemudian pergi ke pangkalan data untuk mendapatkannya selepas digunakan, yang boleh mengurangkan dengan ketara tekanan pada pangkalan data. Seperti yang ditunjukkan dalam rajah di bawah:
Masih menggunakan dua DB untuk memastikan ketersediaan, hanya ID maksimum semasa disimpan dalam pangkalan data. Perkhidmatan penjanaan ID menarik 6 ID dalam kelompok setiap kali, dan mula-mula menukar maxid kepada 5. Apabila aplikasi mengakses perkhidmatan penjanaan ID, ia tidak perlu mengakses pangkalan data dan ID 0~5 dihantar secara berurutan daripada segmen nombor cache. Selepas ID ini dikeluarkan, tukar maxid kepada 11 dan ID 6~11 boleh diedarkan pada masa akan datang. Akibatnya, tekanan pada pangkalan data dikurangkan kepada 1/6 daripada yang asal.
Algoritma kepingan salji Twitter menyelesaikan keperluan sistem teragih untuk menjana ID global dan menjana nombor Panjang 64-bit:
tidak digunakanDigit pertama 41 bit seterusnya ialah masa peringkat milisaat, dan panjang 41 bit boleh mewakili 69 tahun masa
5 digit datacenterId, 5 digit workerId. Panjang 10-bit menyokong penggunaan sehingga 1024 nod
12 bit terakhir dikira dalam milisaat, dan nombor urutan pengiraan 12-bit menyokong setiap nod yang menjana 4096 urutan ID setiap milisaat
🎜🎜 kelebihan ialah : Bilangan milisaat berada pada tahap yang tinggi, dan ID yang dijana biasanya meningkat mengikut arah aliran masa, ia tidak bergantung pada sistem pihak ketiga, dan mempunyai kestabilan dan kecekapan yang tinggi Secara teorinya, QPS adalah kira-kira 409.6w /s (1000*2^12), dan keseluruhan pengedaran Tiada perlanggaran ID dalam sistem boleh diperuntukkan secara fleksibel mengikut perniagaannya sendiri. 🎜🎜Kelemahannya ialah ia sangat bergantung pada jam mesin Jika jam diset semula, ia mungkin menghasilkan penjanaan ID pendua. 🎜Menggabungkan pangkalan data dan penyelesaian ID unik kepingan salji, anda boleh merujuk kepada penyelesaian industri yang lebih matang: Leaf - Sistem penjanaan ID teragih Meituan-Dianping, dan mengambil kira ketersediaan tinggi, pemulihan bencana dan penyebaran Jam dan isu-isu lain.
Apabila perniagaan berkembang pesat dan menghadapi kesesakan prestasi dan penyimpanan, reka bentuk sharding akan dipertimbangkan pada masa ini, adalah tidak dapat dielakkan untuk mempertimbangkan isu pemindahan data sejarah. Pendekatan umum ialah membaca data sejarah dahulu, dan kemudian menulis data pada setiap nod serpihan mengikut peraturan sharding yang ditentukan. Di samping itu, perancangan kapasiti perlu dijalankan berdasarkan volum data semasa dan QPS, serta kelajuan pembangunan perniagaan, untuk mengira anggaran bilangan serpihan yang diperlukan (secara amnya disyorkan bahawa volum data satu jadual pada serpihan tunggal tidak melebihi 1000W)
Jika analisis julat berangka digunakan Untuk serpihan, anda hanya perlu menambah nod untuk mengembangkan, dan tidak perlu memindahkan data serpihan. Jika pembahagian modulo berangka digunakan, agak menyusahkan untuk mempertimbangkan isu pengembangan kemudian.
Mari kita bincangkan tentang masa untuk mempertimbangkan segmentasi data.
Tidak semua jadual perlu dipecah, ia bergantung terutamanya pada kadar pertumbuhan data. Segmentasi akan meningkatkan kerumitan perniagaan pada tahap tertentu Selain membawa penyimpanan data dan pertanyaan, pangkalan data juga merupakan salah satu tugas pentingnya untuk membantu perniagaan dalam merealisasikan keperluannya dengan lebih baik.
Jangan gunakan helah sub-pangkalan data dan sub-jadual melainkan benar-benar perlu untuk mengelakkan "reka bentuk berlebihan" dan "pengoptimuman pramatang". Sebelum membelah pangkalan data dan jadual, jangan pecahkan hanya untuk pemisahan Cuba yang terbaik untuk melakukan apa yang anda boleh dahulu, seperti menaik taraf perkakasan, menaik taraf rangkaian, memisahkan baca dan tulis, pengoptimuman indeks, dsb. Apabila jumlah data mencapai kesesakan satu jadual, pertimbangkan untuk memecah pangkalan data dan jadual.
Pengendalian dan penyelenggaraan yang disebut di sini merujuk kepada:
1) Untuk sandaran pangkalan data, jika satu jadual terlalu besar, sejumlah besar cakera IO diperlukan semasa sandaran dan rangkaian IO. Sebagai contoh, jika 1T data dihantar melalui rangkaian dan menduduki 50MB, ia akan mengambil masa 20,000 saat untuk menyelesaikan penghantaran Risiko keseluruhan proses adalah agak tinggi
2) Apabila membuat pengubahsuaian DDL pada jadual besar, MySQL akan. kunci seluruh jadual. Ini akan mengambil masa yang lama Dalam tempoh ini, perniagaan tidak akan dapat mengakses jadual ini, yang akan memberi kesan yang besar. Jika anda menggunakan pt-online-schema-change, pencetus dan jadual bayangan akan dibuat semasa penggunaan, yang juga mengambil masa yang lama. Semasa operasi ini, ia dikira sebagai masa berisiko. Membahagikan jadual data dan mengurangkan jumlah keseluruhan boleh membantu mengurangkan risiko ini.
3)大表会经常访问与更新,就更有可能出现锁等待。将数据切分,用空间换时间,变相降低访问压力
举个例子,假如项目一开始设计的用户表如下:
id bigint #用户的IDname varchar #用户的名字last_login_time datetime #最近登录时间personal_info text #私人信息..... #其他信息字段
在项目初始阶段,这种设计是满足简单的业务需求的,也方便快速迭代开发。而当业务快速发展时,用户量从10w激增到10亿,用户非常的活跃,每次登录会更新 lastloginname 字段,使得 user 表被不断update,压力很大。而其他字段:id, name, personalinfo 是不变的或很少更新的,此时在业务角度,就要将 lastlogintime 拆分出去,新建一个 usertime 表。
personalinfo 属性是更新和查询频率较低的,并且text字段占据了太多的空间。这时候,就要对此垂直拆分出 userext 表了。
随着业务的快速发展,单表中的数据量会持续增长,当性能接近瓶颈时,就需要考虑水平切分,做分库分表了。此时一定要选择合适的切分规则,提前预估好数据容量
鸡蛋不要放在一个篮子里。在业务层面上垂直切分,将不相关的业务的数据库分隔,因为每个业务的数据量、访问量都不同,不能因为一个业务把数据库搞挂而牵连到其他业务。利用水平切分,当一个数据库出现问题时,不会影响到100%的用户,每个库只承担业务的一部分数据,这样整体的可用性就能提高。
用户中心是一个非常常见的业务,主要提供用户注册、登录、查询/修改等功能,其核心表为:
User(uid, login_name, passwd, sex, age, nickname) uid为用户ID, 主键login_name, passwd, sex, age, nickname, 用户属性
任何脱离业务的架构设计都是耍流氓
,在进行分库分表前,需要对业务场景需求进行梳理:
用户侧:前台访问,访问量较大,需要保证高可用和高一致性。主要有两类需求:
1. Log masuk pengguna: Tanya maklumat pengguna melalui login_name/telefon/e-mel, 1% permintaan tergolong dalam jenis ini 2. Pertanyaan maklumat pengguna: Selepas log masuk, tanya maklumat pengguna melalui uid, 99% permintaan tergolong dalam jenis iniOperasi side : Akses hujung belakang, menyokong keperluan operasi dan melaksanakan pertanyaan halaman berdasarkan umur, jantina, masa log masuk, masa pendaftaran, dsb. Ia adalah sistem dalaman dengan volum capaian rendah dan keperluan rendah pada ketersediaan dan konsistensi.
Apabila jumlah data menjadi lebih besar dan lebih besar, pangkalan data perlu dibahagikan secara mendatar Kaedah segmentasi yang diterangkan di atas termasuk "berdasarkan julat berangka" dan "berdasarkan modulo berangka". ".
"Mengikut julat berangka": Berdasarkan uid kunci primer, data dibahagikan secara mendatar kepada berbilang pangkalan data mengikut julat uid. Contohnya: user-db1 menyimpan data dengan julat uid dari 0 hingga 1000w, dan user-db2 menyimpan data dengan julat uid dari 1000w hingga 2000wuid.
Kelebihannya: pengembangan mudah, jika kapasiti tidak mencukupi, tambah db baru.
Kelemahannya ialah : Jumlah permintaan tidak sekata Secara amnya, pengguna yang baru didaftarkan akan menjadi lebih aktif, jadi pengguna-db2 baharu akan mempunyai beban yang lebih tinggi daripada pengguna-db1, mengakibatkan penggunaan pelayan tidak seimbang
"Mengikut kepada Modul nilai berangka ": Uid kunci primer juga digunakan sebagai asas untuk pembahagian, dan data dibahagikan secara mendatar kepada berbilang pangkalan data berdasarkan nilai modulo uid. Contohnya: user-db1 menyimpan uid data modulo 1, user-db2 menyimpan uid data modulo 0.
Kelebihannya ialah : volum data dan volum permintaan diagihkan sama rata
Keburukan ialah : pengembangan menyusahkan Apabila kapasiti tidak mencukupi, menambah db baharu memerlukan pengubahsuaian. Penghijrahan data yang lancar perlu dipertimbangkan.
Selepas segmentasi mendatar, permintaan untuk pertanyaan oleh uid boleh dipenuhi dengan baik dan boleh dihalakan terus ke pangkalan data tertentu. Untuk pertanyaan berdasarkan bukan-uid, seperti login_name, tidak diketahui perpustakaan mana yang harus diakses Dalam kes ini, semua perpustakaan perlu dilalui, dan prestasi akan dikurangkan dengan banyak.
Untuk bahagian pengguna, penyelesaian "mewujudkan hubungan pemetaan daripada atribut bukan uid kepada uid" boleh diguna pakai untuk bahagian operasi, penyelesaian "memisahkan bahagian depan dan belakang" boleh diguna pakai. . atau cache. Apabila mengakses nama log masuk, tanya dahulu uid yang sepadan dengan login_name melalui jadual pemetaan, dan kemudian cari pustaka tertentu melalui uid.
Jadual pemetaan hanya mempunyai dua lajur dan boleh membawa banyak data Apabila jumlah data terlalu besar, jadual pemetaan juga boleh dibahagikan secara mendatar. Jenis struktur indeks format kv ini boleh menggunakan cache untuk mengoptimumkan prestasi pertanyaan, dan hubungan pemetaan tidak akan kerap berubah, dan kadar hit cache akan menjadi sangat tinggi.
2) Kaedah gen
Gen pemecah: Jika perpustakaan dibahagikan kepada 8 perpustakaan melalui uid, dan penghalaan dilakukan menggunakan uid%8, pada masa ini, 3 bit uid terakhir menentukan di mana baris data Pengguna ini jatuh. Perpustakaan mana yang ada di atasnya, maka 3 bit ini boleh dianggap sebagai gen sub-perpustakaan.
Kaedah perhubungan pemetaan di atas memerlukan storan tambahan bagi jadual pemetaan Apabila membuat pertanyaan dengan medan bukan uid, pangkalan data tambahan atau akses cache diperlukan. Jika anda ingin menghapuskan storan dan pertanyaan yang berlebihan, anda boleh menggunakan fungsi f untuk mengambil gen nama log masuk sebagai gen sub-perpustakaan uid. Apabila menjana uid, rujuk kepada skema penjanaan ID unik yang diedarkan yang diterangkan di atas, ditambah dengan tiga nilai bit terakhir = f (nama log masuk). Apabila menanyakan nama log masuk, anda hanya perlu mengira nilai f(loginname)%8 untuk mencari perpustakaan tertentu. Walau bagaimanapun, ini memerlukan perancangan kapasiti terlebih dahulu, menganggarkan bilangan pangkalan data volum data perlu dibahagikan dalam beberapa tahun akan datang, dan menempah bilangan bit gen pangkalan data tertentu. 3.2. Pengasingan soalan meja depan dan meja belakang.
Berdiri di atas bahu gergasi boleh menjimatkan banyak usaha pada masa ini, terdapat beberapa penyelesaian sumber terbuka yang agak matang untuk sub-pangkalan data dan sub -meja:
Atas ialah kandungan terperinci Pangkalan data dibahagikan kepada pangkalan data dan jadual Bilakah? Bagaimana untuk membahagikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!