Saya pada asalnya menjadualkan temuduga pada pukul tiga, tetapi penemuduga datang dalam talian awal dan melihat saya dalam talian dan memberitahu saya untuk mula awal.
Mengapakah indeks MySQL
menggunakan pokok B+ dan bukannya melangkau jadual?
MySQL
的索引为什么使用B+树而不使用跳表?
Redis
Redis
Mengapa menggunakan jadual lompat Daripada menggunakan pokok B+ atau pokok binari?
Hello penemuduga, nama saya Zhang San, dari Henan Saya lulus dari Universiti XX Saya telah terlibat dalam pembangunan java sejak menamatkan pengajian di XX. Dah 3 tahun. Datang ke syarikat anda untuk temu duga dan dapatkan pekerjaan pembangunan java.
Beberapa perkara untuk memperkenalkan diri anda: Siapa anda dan apakah kekuatan anda? Apa yang telah anda lakukan selama ini? Apakah anugerah yang anda menangi di sekolah? Apakah teknologi yang telah anda lakukan penyelidikan mendalam? Adakah terdapat reka bentuk untuk sistem yang sangat serentak? Pernahkah anda mengambil bahagian dalam mana-mana projek berskala besar?
Ringkasnya, tunjukkan semua aset anda dan beritahu orang lain di bahagian mana anda agak kuat. .
Contohnya: Lima atau enam tahun yang lalu, anda mempunyai dubbo dan Spring Boot dalam tindanan teknologi anda, yang sangat popular, tetapi kini ia adalah standard.
Walau bagaimanapun, masih terdapat sedikit pembangun yang berpengalaman dalam data besar, konkurensi tinggi dan transformasi seni bina, kerana kebanyakan syarikat tidak boleh berkembang menjadi syarikat besar. tetapi. Ini adalah sesuatu yang tidak boleh diubah tidak kira bagaimana kejuruteraan perisian berkembang.Projek yang sangat mencabar mempunyai ciri-ciri berikut:
1. Jumlah data yang besar
2 Konkurensi tinggi3 Transformasi seni bina
Selagi projek anda boleh mempunyai sedikit perkara ini. akan sekurang-kurangnya satu tahap lebih tinggi.
Di sini, saya akan memberi anda templat jawapan:
1 Saya bertanggungjawab untuk projek perniagaan xxx ini, dan perniagaan ini adalah untuk xxx. 2 Untuk percubaan dan kesilapan cepat dan bertindak balas kepada pasaran dengan cepat, pelan xxxx yang mudah digunakan pada peringkat awal. 3 Dengan perkembangan perniagaan, pelan ini mempunyai masalah teknikal xxx dalam xxx. 4 Untuk menyelesaikan masalah teknikal ini, kami akhirnya menggunakan penyelesaian xxx, dan kemudian memperkenalkan penyelesaian ini dan cara penyelesaian ini menyelesaikan masalah teknikal ini.hanya memberitahu kebenaran tentang proses pembelajaran anda, tetapi berhati -hati untuk menunjukkan bahawa anda aktif dalam pembelajaran. kali Ia lebih teruk daripada pen yang buruk.
Adalah disyorkan untuk membaca laman web rasmi, membaca buku, dan menonton video.
Dalam proses pembelajaran, teruskan berlatih, sentiasa bermuhasabah, dan sentiasa merumuskan.
接口>抽象类>实现类
.
Kita boleh menjawab dari lima aspek:
① Jika anda tidak menyatakan nilai kapasiti awal semasa menciptanya, saiz asal lalai Hashtable ialah 11. Selepas setiap pengembangan, kapasiti menjadi 2n+1 asal. Saiz permulaan lalai HashMap ialah 16. Setiap pengembangan seterusnya akan menggandakan kapasiti.
② Jika nilai awal kapasiti diberikan semasa membuat, maka Hashtable akan terus menggunakan saiz yang anda berikan dan HashMap akan mengembangkannya kepada kuasa 2 (tableSizeFor()
jaminan kaedah).tableSizeFor()
方法保证)。
底层数据结构:JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度度大于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
尽管是普通不能再普通的面试题了,可面试中,照样很大部分人同学回答的不好。回答中提到了2的n次幂,面试官很有可能会继续追问相关的问题,如果还不清楚的,建议对HashMap进行系统的学习。
我的博客上之前发过两篇文章:
HashMap
添加一个元素的流程HashMap
Walaupun Ini adalah soalan temu bual yang sangat biasa, tetapi semasa temu duga, ramai pelajar masih tidak menjawabnya dengan baik. Kuasa ke-2 disebut dalam jawapan Penemuduga mungkin akan terus bertanya soalan yang berkaitan Jika masih tidak jelas, adalah disyorkan untuk mengkaji HashMap secara sistematik.
Saya telah menyiarkan dua artikel di blog saya sebelum ini: blockquote >
HashMap
Proses menambah elemen
HashMap
Proses menambah elemen dalam put boleh dibahagikan kepada 9 langkah berikut: . . Indeks tatasusunan dengan cincang Panjang -1 adalah DAN dengan nilai cincangan kunci untuk mendapatkan indeks dalam tatasusunan Jika kedudukan yang ditentukan oleh indeks itu kosong, ia bermakna ia boleh dimasukkan dan nod baharu boleh dimasukkan. terusPokok Hitam Merah ialah pokok AVL khusus (pokok binari seimbang Ia menggunakan operasi khusus untuk mengekalkan keseimbangan pepohon carian binari semasa operasi pemasukan dan pemadaman, dengan itu memperoleh prestasi carian yang lebih tinggi).
putVal()
4 Tentukan kunci semasa Adakah ia wujud, gantikan jika penggantian berjaya, kembalikan nilai lama5 adalah jenis pokok. Jika ia adalah jenis pokok, tambahkannya mengikut operasi pokok 6 Jika nod di mana konflik cincang berlaku bukan jenis pokok, ia bermakna perlanggaran semasa dalam senarai terpaut, dan kemudian logik pemprosesan gelung akan dimasukkan pada masa ini 7 Selepas memasukkan logik gelung, mula-mula tentukan apa yang sedang diproses Semak sama ada nod perlanggaran seterusnya adalah kosong kosong, masukkan nod baharu ke dalam 8 Selepas memasukkannya, nilaikan sama ada senarai terpaut semasa melebihi panjang senarai terpaut maksimum yang dibenarkan iaitu 8. Jika melebihi, ia akan ditukar kepada pokok merah-hitam untuk dimasukkan. 9 Jika jadual indeks peta kosong atau panjang jadual indeks semasa kurang daripada 64 (panjang jadual tatasusunan indeks maksimum untuk penukaran pokok merah-hitam), maka lakukan sahaja operasi ubah saiz; nod yang berlanggar tidak kosong, Kemudian hanya tambahkan nod dan masukkannya di sepanjang pokok nod yang berlanggar - Anda boleh membaca catatan blog di blog saya: Tiga tahun kod sumber HashMap penting: http://www .woaijava.cc/blog/ 211
- Apakah pokok merah-hitam dan apakah ciri-cirinya?
Ada 5 ciri pokok merah-hitam:
Nod akar berwarna hitam.
Semua daun berwarna hitam (daun adalah nod NIL)
Dua nod anak bagi setiap nod merah berwarna hitam. (Tidak boleh ada dua nod merah berturut-turut pada semua laluan dari setiap daun ke akar)
Semua laluan dari mana-mana nod ke setiap daunnya mengandungi bilangan nod hitam yang sama. . sedikit yang dapat menceritakannya.
Ciri-ciri pokok B+, berapa banyak lapisan, berapa banyak data yang boleh disimpan? mempunyai fungsi indeks, iaitu, nod bukan daun hanya boleh menyimpan Kunci, tetapi bukan nilai2 Semua nod daun pokok membentuk senarai terpaut tersusun, dan semua data boleh dilalui mengikut urutan pengisihan kunci. .B+ pokok selalunya 1 lorong dan 3 lapisan.
Saiz halaman InnoDB
Lalainya ialah 16KB:
- Andaikan saiz rekod ialah 1KB, maka 16 keping data boleh disimpan dalam halaman data (mengabaikan struktur data lain dalam halaman)
- Anggap bahawa kunci utama ialah int , dan saiz penunjuk ialah 6B, maka halaman indeks boleh menyimpan
16KB/(4B+6B)≈1638
indeksJadi, pokok B+ dua lapisan boleh menyimpan:
16*1638=26208
keping data; pokok B+ tiga lapisan boleh menyimpan:16*1638*1638=42928704 keping data. Mengapakah indeks
MySQL
menggunakan pepohon B+ dan bukannya jadual lompat?- B+ tree
ialah struktur berbilang pokok Setiap nod ialah halaman data 16k, yang boleh menyimpan lebih banyak maklumat indeks, jadi fan-out sangat tinggi 16KB/(4B+6B)≈1638
个索引所以,两层的B+树可以存储:
16*1638=26208
条数据;三层的B+树可以存储:16*1638*1638=42928704
条数据。
MySQL
的索引为什么使用B+树而不使用跳表?B+树是多叉树结构,每个结点都是一个16k的数据页,能存放较多索引信息,所以扇出很高。三层左右就可以存储
tiga kali.2kw
.Tiga lapisanboleh disimpan2kw
data sekeliling. Dalam erti kata lain, jika anda menanyakan data sekali, jika halaman data ini semuanya ada pada cakera, anda perlu menanyakan IO cakera paling banyakLompat senaraiialah struktur senarai terpaut, satu keping data ialah satu nod Jika lapisan bawah hendak disimpan
2kw
data, dan setiap pertanyaan mesti mencapai kesan2kw
数据,且每次查询都要能达到二分查找的效果,2kw
大概在2的24次方
左右,所以,跳表大概高度在24层左右。最坏情况下,这24层数据会分散在不同的数据页里,也即是查一次数据会经历24次磁盘IO。因此存放同样量级的数据,B+树的高度比跳表的要少,如果放在MySQL数据库上来说,就是磁盘IO次数更少,因此B+树查询更快。
而针对写操作,B+树需要拆分合并索引数据页,跳表则独立插入,并根据随机函数确定层数,没有旋转和维持平衡的开销,因此跳表的写入性能会比B+树要好。
其实,MySQL的存储引擎是可以换的,以前mysql 5.5是
myisam
,后来才有的innodb
,它们底层索引用的都是B+树。也就是说,你完全可以造一个索引为跳表的存储引擎装到MySQL里。事实上,rocksDB
的存储引擎,里面就用了跳表。直接说结论,它的写入性能确实是比innodb要好,但读性能确实比innodb要差不少。感兴趣的话,可以在文章最后面的参考资料里看到他们的性能对比数据。. Dalam kes yang paling teruk, 24 lapisan data ini akan bertaburan dalam halaman data yang berbeza, yang bermaksud bahawa satu pertanyaan data memerlukan
Redis
binary search tingkat 2424 cakera IO
. Jadi untuk menyimpan jumlah data yang sama, ketinggian pokok B+ adalah kurang daripada jadual langkau Jika ia diletakkan pada pangkalan data MySQL, ia bermakna bilangan IO cakera adalah lebih sedikit, jadi pokok B+. pertanyaan lebih pantas. Untuk operasi tulis, pokok B+ perlu membelah dan menggabungkan halaman data indeks, dan jadual langkau dimasukkan secara berasingan, dan bilangan lapisan ditentukan berdasarkan fungsi rawak Tiada overhed penyelenggaraan putaran dan keseimbangan , jadi prestasi tulis jadual langkau akan menjadi Lebih Baik daripada pokok B+. Sebenarnya, enjin storan MySQL boleh ditukar Sebelum ini, mysql 5.5 ialahmyisam
, yang datang kemudianinnodb
, indeks asasnya semuanya menggunakan B+tree. Dengan kata lain, anda boleh membina enjin storan sepenuhnya dengan indeks jadual langkau dan memasangnya dalam MySQL. Malah,enjin storan rocksDB, yang menggunakan hopping Table . Bercakap terus kepada kesimpulannya, prestasi tulisnya memang lebih baik daripada innodb, tetapi prestasi bacanya memang jauh lebih teruk daripada innodb. Jika anda berminat, anda boleh melihat data perbandingan prestasi mereka dalam Rujukan di penghujung artikel.
Redis
Mengapa menggunakan senarai langkau dan bukannya pokok B+ atau pokok binari? Oleh kerana prinsip pokok B+ ialah nod daun menyimpan data dan nod bukan daun menyimpan indeks Setiap nod pokok B+ boleh menyimpan berbilang kata kunci Ia menetapkan saiz nod kepada saiz halaman cakera, menggunakan sepenuhnya fungsi pra-pemprosesan cakera. Setiap kali halaman cakera dibaca, keseluruhan nod dibaca Setiap nod daun juga mempunyai penunjuk ke nod sebelumnya dan seterusnya, untuk meminimumkan IO cakera. Kerana masa yang diperlukan untuk membaca data dalam ingatan adalah satu juta daripada bacaan IO dari cakera, dan Redis mengendalikan data dalam ingatan dan tidak melibatkan IO, jadi jadual langkau digunakanApakah yang perlu anda perhatikan semasa membuat indeks?
Soalan ini juga boleh digunakan apabila bertanya tentang pengoptimuman SQL yang anda tahu.
Lajur yang paling sesuai untuk pengindeksan ialah lajur yang muncul selepas kata kunci WHERE
子句中的列,或连接子句中的列,而不是出现在SELECT
.Semakin besar kardinaliti lajur indeks, lebih baik kesan pengindeksan. Buat indeks komposit mengikut situasi. Elakkan membuat terlalu banyak indeks, yang akan menduduki ruang cakera tambahan dan mengurangkan kecekapan operasi tulis. Pilih jenis data yang lebih pendek sebanyak mungkin untuk kunci utama, yang boleh mengurangkan penggunaan cakera indeks dengan berkesan dan meningkatkan kecekapan pertanyaan. Apabila mengindeks rentetan, anda harus menyesuaikan panjang awalan, yang boleh menjimatkan banyak ruang indeks. Jika jumlah data dalam satu jadual melebihi berpuluh juta, bagaimana untuk mengoptimumkannya?
1 Semasa mereka bentuk pangkalan data dan membuat jadual, pertimbangkan isu prestasi Contohnya: satu jadual tidak sepatutnya mempunyai terlalu banyak medan dibuat dengan cara yang disasarkan berdasarkan pertanyaan Pertimbangkan Apabila lajur yang terlibat dalam perintah WHERE dan ORDER BY diindeks, anda boleh menggunakan EXPLAIN untuk menyemak sama ada indeks atau imbasan jadual penuh digunakan, pilih jenis data yang sesuai, pilih jenis indeks yang sesuai, dsb.
2 Apabila menulis SQL, anda perlu memberi perhatian Sebagai contoh: jangan gunakan seluruh jadual untuk data senarai Gunakan LIMIT bilangan halaman tidak boleh terlalu besar * dengan menghidupkan log pertanyaan perlahan , senaraikan medan untuk ditemui, dsb.
3. Pemilihan enjin storan,MyISAM sesuai untuk jadual intensif PILIH, manakala InnoDB sesuai untuk jadual intensif INSERT dan UPDATE.
4. Sub-pangkalan data dan sub-jadual, sebagai contoh:Sub-pangkalan dataBahagikan pangkalan data kepada beberapa pangkalan data adalah disyorkan untuk mengasingkan sub-pangkalan data juga akan membawa banyak kos pembangunan. yang tidak berbaloi dengan keuntungan! Ia tidak disyorkan untuk menggunakanPembahagian jadualadalah untuk mengoptimumkan jadual besar mengikut proses di atas, tetapi jika pertanyaan masih tersekat, kemudian bahagikan jadual kepada beberapa jadual, bahagikan satu pertanyaan kepada berbilang pertanyaan, dan kemudian kembalikan hasil gabungan kepada pengguna. Pemisahan jadual dibahagikan kepada pemisahan menegak dan pemisahan mendatar, dan medan tertentu biasanya digunakan sebagai item pemisahan. Sebagai contoh, medan id digunakan untuk membahagikan jadual kepada 100 jadual: nama jadual ialah tableName_id%100. Walau bagaimanapun: sub-jadual memerlukan pengubahsuaian kod program sumber, yang akan membawa banyak kerja kepada pembangunan dan sangat meningkatkan kos pembangunan Oleh itu: ia hanya sesuai untuk mempertimbangkan kewujudan sejumlah besar data pada peringkat awal pembangunan dan melakukan kerja yang baik dalam pemprosesan sub-jadual, dan tidak sesuai untuk aplikasi Ia akan menjadi terlalu mahal untuk membuat pengubahsuaian selepas ia masuk dalam talian.
5 Upgrade hardware, cara ni paling mudah, tapi kos relatifnya juga tinggi, jadi bos tak sanggup nak buat.
6. Naik taraf pangkalan data, contohnya: gantikan pangkalan data MySQL dengan enjin data besar untuk memproses data, atau gantikan dengan Alibaba Cloud POLARDB ialah pangkalan data asli awan tebaran relasi yang dibangunkan oleh Alibaba Cloud dengan MySQL dan mempunyai kapasiti storan tertinggi Ia boleh mencapai 100T, dan prestasinya sehingga 6 kali ganda daripada MySQL.
Sebuah jadual a dengan 5 juta keping data dan satu jadual b dengan 3 juta keping data berkaitan melalui tid kunci asing Bagaimana kita boleh bertanya dengan cepat 200 rekod data dari 50000 hingga 50200 yang memenuhi syarat?
Kaedah 1: Jika tid jadual a meningkat sendiri dan berterusan, id jadual b ialah indeks. Pernyataan SQL adalah seperti berikut.
select * from a,b where a.tid = b.id and a.tid>500000 limit 200;Salin selepas log masukKaedah 2: Jika tid jadual a tidak berterusan, maka anda perlu menggunakan indeks penutup adalah sama ada kunci utama atau indeks tambahan, dan id jadual b juga perlu mempunyai indeks. Pernyataan SQL adalah seperti berikut.
select * from b, (select tid from a limit 50000,200) a where b.id = a.tid;Salin selepas log masukMari kita bincangkan tentang model memori JVM
Struktur memori JVM termasuk: pembilang program, memori timbunan, kawasan kaedah dan tindanan (timbunan mesin maya java dan timbunan kaedah tempatan).
Daftar Kaunter Program ialah ruang memori kecil Fungsinya boleh dianggap sebagai penunjuk nombor baris kod bait yang dilaksanakan oleh utas semasa. Dalam model konsep mesin maya (hanya model konseptual, pelbagai mesin maya boleh dilaksanakan dengan cara yang lebih cekap), jurubahasa bytecode berfungsi dengan menukar nilai pembilang ini untuk memilih langkah seterusnya yang perlu dilaksanakan seperti arahan bytecode, cawangan, gelung, lompatan, pengendalian pengecualian dan pemulihan benang semuanya bergantung pada kaunter ini untuk diselesaikan.
Memori timbunan adalah bahagian terbesar JVM dan terdiri daripada generasi muda dan generasi lama Memori generasi muda dibahagikan kepada tiga bahagian, ruang Eden, ruang Dari Survivor, dan Angkasa To Survivor secara lalai diperuntukkan mengikut nisbah
8:1:1
;Kawasan kaedah menyimpan maklumat kelas, pemalar, pembolehubah statik dan data lain Ia adalah kawasan yang dikongsi oleh benang Untuk membezakannya daripada timbunan Java, kawasan kaedah juga mempunyai alias Non -Timbunan (bukan timbunan); timbunan dibahagikan kepada timbunan mesin maya Java Dan timbunan kaedah tempatan digunakan terutamanya untuk pelaksanaan kaedah. Kawasan kaedah boleh difahami sebagai spesifikasi, dan pelaksanaannya adalah seperti penjanaan kekal dan metaspace.
Java Virtual Machine Stacks (Java Virtual Machine Stacks) juga adalah benang-pribadi,Kitaran hayatnya adalah sama seperti benang. Tindanan mesin maya menerangkan model memori pelaksanaan kaedah Java:Apabila setiap kaedah dilaksanakan, bingkai tindanan (Stack Frame) dicipta pada masa yang sama untuk menyimpan maklumat seperti jadual pembolehubah tempatan, tindanan operasi, pautan dinamik, kaedah keluar , dsb. Proses daripada setiap kaedah yang dipanggil sehingga pelaksanaan selesai sepadan dengan proses bingkai tindanan yang ditolak dari tindanan untuk dikeluarkan daripada tindanan dalam tindanan mesin maya.
Timbunan Kaedah Asli dan timbunan mesin maya memainkan peranan yang hampir sama Satu-satunya perbezaan ialah timbunan mesin maya berfungsi kepada mesin maya untuk melaksanakan kaedah Java (iaitu, kod bait), manakala timbunan kaedah asli Ia menyediakan kaedah Native. digunakan oleh mesin maya.Spesifikasi mesin maya tidak mewajibkan bahasa, penggunaan dan struktur data kaedah dalam timbunan kaedah tempatan, jadi mesin maya tertentu boleh melaksanakannya dengan bebas.
Kenapa kawasan Survivor diperlukan
Jika tiada Survivor, setiap kali Minor GC dilakukan di kawasan Eden, dan tiada had umur, objek yang masih hidup akan dihantar kepada generasi lama. Akibatnya, generasi lama cepat terisi, mencetuskan Major GC (kerana Major GC biasanya disertai oleh Minor GC, ia juga boleh dianggap sebagai mencetuskan GC Penuh). Ruang ingatan generasi lama jauh lebih besar daripada generasi baharu, dan GC Penuh mengambil masa lebih lama daripada GC Kecil.
Pewawancara mungkin bertanya: Apakah keburukan masa pelaksanaan yang panjang
Kerap GC Penuh menggunakan masa yang lama dan akan menjejaskan pelaksanaan dan kelajuan tindak balas program besar.
Jika ruang generasi lama ditambah, lebih banyak objek yang masih hidup boleh mengisi generasi lama. Walaupun kekerapan GC Penuh dikurangkan, apabila ruang generasi lama bertambah, apabila GC Penuh berlaku, ia akan mengambil masa yang lebih lama untuk dilaksanakan.
Jika ruang generasi lama dikurangkan, walaupun masa yang diperlukan untuk Full GC dikurangkan, generasi lama akan segera dipenuhi dengan objek yang masih hidup, dan kekerapan Full GC akan meningkat.
Jadi maksud kewujudan Survivor adalah untuk mengurangkan objek yang dihantar kepada generasi lama, dengan itu mengurangkan kejadian pra-saringan Survivor memastikan bahawa hanya objek yang boleh bertahan dalam generasi baharu selepas 16 GC Minor akan dihantar kepada. usia tua.
Ada apa-apa nak tanya saya?
Sesetengah penemuduga menanyakan soalan ini dengan sopan dan tidak memberi banyak perhatian kepada jawapan anda, kerana temu duga mungkin hebat pada masa ini.
Namun, jika ada peluang untuk bertanya, kebanyakan orang masih menganggap anda baik dan kebarangkalian untuk diterima masuk adalah sangat tinggi, jadi anda tetap perlu menjawab dengan teliti
Walau apa pun mentalitinya, kita cuma ada untuk berkelakuan baik.
Soalan ini mungkin kelihatan tidak dapat diketepikan, tetapi ia sebenarnya sangat kritikal secara amnya, penemuduga tidak suka orang yang berkata "Tiada masalah" kerana mereka memberi perhatian yang tinggi kepada personaliti dan keupayaan inovasi pekerja. Syarikat tidak suka pencari kerja bertanyakan soalan tentang faedah peribadi Jika seseorang bertanya: Adakah syarikat anda mempunyai sebarang program latihan untuk pekerja baharu? Atau apakah mekanisme promosi syarikat anda? Syarikat akan mengalu-alukan anda kerana ia menunjukkan semangat anda untuk belajar dan kesetiaan anda kepada syarikat, serta cita-cita anda.
Atas ialah kandungan terperinci Temuduga Teknologi SF. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!