golang - 有哪些设计数据结构方面的小技巧(奇技淫巧)?
迷茫
迷茫 2017-04-24 09:11:24
0
2
915

传奇的软件工程师Frederick P. Brooks曾经说过:“给我看你的数据”。因此可见数据结构对于一个程序来说是多么的重要,如果你不了解程序中的数据结构,你根本就无法去理解整个程序

有哪些设计数据结构方面的小技巧?

迷茫
迷茫

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

membalas semua(2)
刘奇

Perkataan yang ditulis sebelum ini: Hanya selepas bencana berlaku, seseorang itu mengingati kepentingan pemulihan bencana; hanya selepas seseorang mengalami kerugian barulah seseorang itu mengingati peringatan seseorang

Artikel ini terutamanya untuk pangkalan data mysql

Prinsip Reka Bentuk

1. Jangan lakukan pengiraan dalam pangkalan data: pengiraan CPU mesti dialihkan ke lapisan perniagaan
2. Kawal jumlah data dalam satu jadual: rekod dalam satu jadual dikawal pada 1000w3. Kawal bilangan lajur: bilangan medan dikawal dalam 20
4 Paradigma dan redundansi: mengorbankan reka bentuk paradigma dan data berlebihan untuk meningkatkan kecekapan
5 , kumpulan besar
6 Gunakan UTF8 untuk set aksara jadual
7. Gunakan enjin storan INNODB

Reka bentuk jadual data

1. Gunakan jenis data yang paling berkesan (paling kecil) sebanyak mungkin

tinyint(1Byte)
smallint(2Byte)
mediumint(3Byte)
int(4Byte)
bigint(8Byte)
bad case:int(1)/int(11)
2. Jangan simpan nombor sebagai rentetan, tukar aksara kepada nombor, gunakan int untuk menyimpan ip dan bukannya char(15)

3. Gunakan enum atau tetapkan dahulu,
enum ('F', '. M ')sex4, elakkan menggunakan medan NULL

NULL字段很难查询优化
NULL字段的索引需要额外空间
NULL字段的复合索引无效
bad case:`name` char(32) default null`age` int not null
good case:`age` int not null default 0
5. Gunakan kurang teks/blob, prestasi varchar akan lebih tinggi daripada teks; jika anda tidak dapat mengelakkan gumpalan, sila belah jadual

6 Jangan simpan gambar dalam pangkalan data
7 . Untuk jadual MyISAM, jika tiada lajur Pembolehubah-panjang (VARCHAR, TEXT, atau lajur BLOB) gunakan format rekod saiz tetap. Ini lebih pantas tetapi malangnya mungkin membazirkan sedikit ruang. Walaupun anda telah menggunakan pilihan CREATE untuk menjadikan lajur VARCHAR ROW_FORMAT=tetap, anda masih boleh digesa untuk menggunakan baris panjang tetap
8. Gunakan set aksara contoh, seperti latin1. Cuba gunakan utf-8 sesedikit mungkin, kerana utf-8 mengambil 3 kali ganda ruang latin1. Anda boleh menggunakan latin1 pada medan yang tidak perlu menggunakan utf-8, seperti mel, url, dll.
9. Penukaran antara ketepatan dan ruang. Jenis titik terapung biasanya menggunakan kurang ruang daripada jenis DECIMAL apabila menyimpan data dalam julat berangka yang sama. Medan FLOAT menggunakan 4 bait untuk menyimpan data. Jenis DOUBLE memerlukan 8 bait dan mempunyai ketepatan yang lebih tinggi dan julat berangka yang lebih besar Data jenis PERPULUHAN akan ditukar kepada jenis DOUBLE
10. Nama perpustakaan, nama jadual dan nama medan mesti mempunyai panjang penamaan tetap, 12. Dalam aksara, nama perpustakaan, nama jadual dan nama medan tidak dibenarkan melebihi 32 aksara. Maksud nama mesti difahami; perkataan simpanan MySQL dilarang dalam nama perpustakaan, nama jadual, dan nama pustaka sementara dan nama jadual mesti diawali dengan tmp dan akhiran dengan pustaka dan jadual sandaran; dan diakhiri dengan tarikh
11. Panjang fizikal rekod baris jadual InnoDB tidak melebihi 8KB Halaman data lalai InnoDB ialah 16KB Berdasarkan ciri B+Tree, halaman data perlu menyimpan sekurang-kurangnya 2 rekod . Oleh itu, apabila panjang storan sebenar lajur besar melebihi 8KB (terutamanya lajur TEXT/BLOB), ia akan menyebabkan "storan limpahan halaman", serupa dengan "penghijrahan baris" dalam ORACLE Oleh itu, jika lajur besar mesti digunakan ( Terutamanya TEXT/BLOB type) dan jika ia dibaca dan ditulis dengan kerap, sebaiknya bahagikan lajur ini kepada sub-jadual dan jangan simpannya bersama-sama dengan jadual utama Jika ia tidak terlalu kerap, anda boleh mempertimbangkan untuk menyimpannya dalam jadual utama. Jika Tukar pilihan saiz innodb
halaman kepada 8KB, maka panjang fizikal rekod baris disyorkan tidak melebihi 4KB

Kelas indeks

1. Gunakan indeks dengan berhati-hati dan rasional

改善查询、减慢更新
索引一定不是越多越好(能不加就不加,要加的一定得加)
覆盖记录条数过多不适合建索引,例如“性别”

2. Indeks awalan mesti dibina untuk medan aksara
3 Jangan lakukan operasi lajur dalam indeks, kes buruk: pilih id di mana umur +1 = 10;
4 lajur kenaikan automatik untuk kunci utama innodb

主键建立聚簇索引
主键不应该被修改
字符串不应该做主键
如果不指定主键,innodb会使用唯一且非空值索引代替

5. Jangan gunakan kunci asing, sila pastikan kekangan oleh program
6. Contohnya: Jika indeks (a, b) wujud, alih keluar indeks (a)
7. Kawal panjang indeks tunggal. Gunakan kekunci (nama (8)) untuk mencipta indeks pada beberapa aksara pertama data
8. Gunakan indeks secara selektif. Tidak baik menggunakan indeks pada lajur yang jarang berubah, seperti lajur jantina
9 jadual Optimize boleh memampatkan dan mengisih indeks, berhati-hati untuk tidak menjalankannya dengan kerap
10 >11. Selektiviti Indeks ialah nisbah nilai indeks unik, juga dipanggil kardinaliti, kepada bilangan baris data dalam jadual selektiviti indeks = kardinaliti/baris data, kiraan(berbeza(nama pengguna))/bilangan(*) ialah selektiviti indeks. , indeks tinggi Kelebihan selektiviti ialah MySQL boleh menapis lebih banyak baris apabila mencari padanan Indeks unik mempunyai selektiviti terbaik, dengan nilai 1
12 Jangan gunakan indeks pendua atau berlebihan Enjin INNODB, setiap kali Untuk mengubah suai data, anda mesti mengubah suai indeks kunci utama dan nilai indeks yang sepadan dalam indeks tambahan Ini boleh menyebabkan sejumlah besar pemindahan data, halaman dan pemecahan
13. Untuk lajur rentetan dengan. panjang lebih daripada 20, adalah lebih baik untuk mencipta indeks lajur bukan integer (contohnya: ALTER JADUAL t1 ADD INDEX(pengguna(20))) boleh meningkatkan penggunaan indeks dengan berkesan, tetapi kelemahannya ialah awalan. indeks tidak digunakan semasa mengisih lajur ini. Panjang indeks awalan boleh ditentukan berdasarkan statistik medan Secara amnya, ia lebih besar sedikit daripada purata panjang
14. Gunakan alat pt-duplicate-key-checker secara kerap untuk menyemak dan memadam indeks pendua. Contohnya, jika indeks idx1(a, b) sudah meliputi indeks idx2(a), anda boleh memadamkan indeks idx2

Kelas reka bentuk pernyataan SQL

1. Pernyataan sql semudah mungkin Satu sql hanya boleh dikendalikan pada satu CPU yang besar dipecahkan kepada penyataan yang lebih kecil untuk mengurangkan masa kunci sql (menggunakan sepenuhnya QUERY CACHE dan gunakan sepenuhnya CPU berbilang teras)

2. Transaksi mudah, masa transaksi hendaklah sesingkat mungkin, kes buruk: muat naik imej transaksi
3. Elakkan penggunaan trig/func, pencetus dan fungsi tidak digunakan, gantikannya dengan program klien
4 Tidak perlu pilih *, Menggunakan cpu, io, memori, dan lebar jalur Program jenis ini tidak boleh berskala
5 >

or的效率是n级别
in的消息时log(n)级别
in的个数建议控制在200以内
select id from t where phone=’159′ or phone=’136′ =>select id from t where phone in (’159′, ’136′);

6. ATAU ditulis semula sebagai KESATUAN

Penggabungan indeks MySQL sangat terencat

select id from t where phone = '159' or name = 'john';
=>
select id from t where phone='159' union  select id from t where name='jonh';

7. Elakkan % negatif, seperti tidak dalam/suka

8 Gunakan count(*) dengan berhati-hati

9
Semakin besar had, semakin rendah kecekapan

select id from t limit 10000, 10;
=>
select id from t where id > 10000 limit 10;
10. Gunakan kesatuan semua dan bukannya kesatuan mempunyai overhed deduplikasi

11 Gunakan kurang gabungan

12 >14. Gunakan data muat untuk mengimport data adalah kira-kira 20 kali lebih cepat daripada memasukkan;

15. Gunakan alat analisis prestasi

Sql explain  /  showprofile   /    mysqlsla

17. Gunakan --log-slow-queries --long-query-time=2 untuk melihat pernyataan pertanyaan perlahan. Kemudian gunakan explain untuk menganalisis pertanyaan dan membuat pengoptimuman
show profile;
mysqlsla;
mysqldumpslow;
explain;
show slow log;
show processlist;
show query_response_time(percona)

optimumkan Apabila data dimasukkan, dikemas kini dan dipadamkan, beberapa pemindahan data dan halaman tidak dapat dielakkan, dan kemudian beberapa serpihan akan muncul dari masa ke masa, serpihan terkumpul dan menjejaskan prestasi Ini memerlukan DBA untuk sentiasa mengoptimumkan pangkalan data untuk mengurangkan serpihan , yang dilakukan melalui arahan mengoptimumkan. Contohnya, beroperasi pada jadual MyISAM: optimumkan nama jadual jadual

18. Dilarang menjalankan pertanyaan besar dalam pangkalan data
19 Gunakan penyata yang telah disusun dan hanya lulus parameter, yang lebih cekap daripada menghantar penyataan SQL sekali dan mengurangkan kebarangkalian suntikan SQL
20. Dilarang menggunakan perintah oleh rand()
21. Dilarang mengemas kini berbilang jadual pada masa yang sama dengan satu pernyataan SQL
22 tidak pandai dalam operasi matematik dan pertimbangan logik)
23 , pernyataan SQL memerlukan semua P&P, kata kunci SQL semuanya huruf besar, dan setiap perkataan hanya dibenarkan mempunyai satu ruang
24. Jika anda boleh menggunakan NOT IN, anda boleh menggunakan NOTIN. Terdapat terlalu banyak perangkap. . Akan mengesan kosong dan NULL

Perhatian

1. Walaupun ia adalah penapisan bersyarat berdasarkan indeks, jika pengoptimum menyedari bahawa jumlah keseluruhan data yang perlu diimbas melebihi 30% (nampaknya 20% dalam ORACLE, dan pada masa ini 30% dalam MySQL, ia mungkin dilaraskan pada masa hadapan), ia akan menukar secara langsung pelan pelaksanaan kepada imbasan jadual penuh dan tidak lagi menggunakan indeks
2. Apabila menyertai berbilang jadual, penapisan hendaklah yang terbesar (tidak semestinya jumlah terkecil data, tetapi yang mempunyai penapisan terbesar selepas menambah keadaan WHERE) ) dipilih sebagai jadual pemacu. Di samping itu, jika terdapat pengisihan selepas JOIN, medan pengisihan mesti dimiliki oleh jadual pemacu, supaya indeks pada jadual pemacu boleh digunakan untuk melengkapkan pengisihan
3. Dalam kebanyakan kes, kos pengisihan biasanya adalah lebih tinggi, jadi jika anda melihat Terdapat Menggunakan filesort dalam pelan pelaksanaan, jadi buat indeks isihan dahulu
4. Gunakan pt-query-digest untuk kerap menganalisis log pertanyaan perlahan dan gabungkannya dengan Box Anemometer untuk membina pertanyaan perlahan analisis log dan sistem pengoptimuman

迷茫

Saya melihat sesuatu yang menarik hari ini:
Algoritma/struktur data yang manakah harus saya "kenali" dan ketahui dengan nama?

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