Karena Anda memberikan hadiah, saya akan membagikan rahasia yang saya peroleh dengan susah payah...
Secara umum, semua SQL yang saya setel hari ini diperlukan menggunakan sub-kueri. Berasal dari dunia database Oracle, hal-hal yang saya anggap remeh tidak bekerja sama dengan MySQL. Dan bacaan saya tentang penyetelan MySQL membuat saya menyimpulkan bahwa MySQL berada di belakang Oracle dalam hal mengoptimalkan kueri.
Sementara kueri sederhana yang diperlukan untuk sebagian besar aplikasi B2C dapat bekerja dengan baik untuk MySQL, sebagian besar jenis kueri pelaporan agregat yang diperlukan untuk Pelaporan Intelijen tampaknya memerlukan sedikit perencanaan dan pengaturan ulang kueri SQL untuk memandu MySQL agar menjalankannya lebih cepat.
Administrasi:
max_connections
adalah jumlah koneksi bersamaan. Nilai default adalah 100 koneksi (151 sejak 5.0) - sangat kecil.
Catatan:
koneksi mengambil memori dan OS Anda mungkin tidak dapat menangani banyak koneksi.
Binari MySQL untuk Linux/x86 memungkinkan Anda memiliki hingga 4096 koneksi bersamaan, tetapi biner yang dikompilasi sendiri seringkali memiliki batas yang lebih kecil.
Setel table_cache agar sesuai dengan jumlah tabel terbuka dan koneksi bersamaan Anda. Perhatikan nilai open_tables dan jika tumbuh dengan cepat, Anda perlu menambah ukurannya.
Catatan:
2 parameter sebelumnya mungkin memerlukan banyak file yang terbuka. 20+max_connections+table_cache*2 adalah perkiraan yang baik untuk apa yang Anda butuhkan. MySQL di Linux memiliki opsi open_file_limit, tetapkan batas ini.
Jika Anda memiliki kueri yang kompleks, sort_buffer_size dan tmp_table_size mungkin sangat penting. Nilai akan bergantung pada kompleksitas kueri dan sumber daya yang tersedia, tetapi 4Mb dan 32Mb, masing-masing, direkomendasikan sebagai titik awal.
Catatan:Ini adalah nilai "per koneksi", di antara read_buffer_size, read_rnd_buffer_size dan beberapa lainnya, artinya nilai ini mungkin diperlukan untuk setiap koneksi. Jadi, pertimbangkan beban Anda dan sumber daya yang tersedia saat mengatur parameter ini. Misalnya sort_buffer_size dialokasikan hanya jika MySQL perlu melakukan pengurutan. Catatan:hati-hati jangan sampai kehabisan memori.
Jika Anda memiliki banyak koneksi yang dibuat (yaitu situs web tanpa koneksi persisten), Anda dapat meningkatkan kinerja dengan menyetel thread_cache_size ke nilai bukan nol. 16 adalah nilai yang baik untuk memulai. Tingkatkan nilainya hingga threads_created Anda tidak berkembang pesat.
KUNCI UTAMA:
Hanya boleh ada satu kolom AUTO_INCREMENT per tabel, kolom harus diindeks, dan tidak boleh memiliki nilai DEFAULT
KEY biasanya sinonim untuk INDEX. Atribut kunci PRIMARY KEY juga dapat ditentukan hanya sebagai KUNCI ketika diberikan dalam definisi kolom. Ini diimplementasikan untuk kompatibilitas dengan sistem database lain.
KUNCI UTAMA adalah indeks unik di mana semua kolom kunci harus didefinisikan sebagai NOT NULL
Jika PRIMARY KEY atau indeks UNIK hanya terdiri dari satu kolom yang memiliki tipe integer, Anda juga dapat merujuk ke kolom sebagai "_rowid" dalam pernyataan SELECT.
Di MySQL, nama PRIMARY KEY adalah PRIMARY
Saat ini, hanya tabel InnoDB (v5.1?) yang mendukung kunci asing.
Biasanya, Anda membuat semua indeks yang Anda butuhkan saat membuat tabel. Setiap kolom yang dideklarasikan sebagai PRIMARY KEY, KEY, UNIQUE, atau INDEX akan diindeks.
NULL berarti "tidak memiliki nilai". Untuk menguji NULL, Anda tidak bisa gunakan operator perbandingan aritmatika seperti =, <, atau <>. Gunakan operator IS NULL dan IS NOT NULL sebagai gantinya:
NO_AUTO_VALUE_ON_ZERO menekan kenaikan otomatis untuk 0 sehingga hanya NULL yang menghasilkan nomor urut berikutnya. Mode ini dapat berguna jika 0 telah disimpan di kolom AUTO_INCREMENT tabel. (Menyimpan 0 bukanlah praktik yang disarankan.)
Untuk mengubah nilai penghitung AUTO_INCREMENT yang akan digunakan untuk baris baru:
ALTER TABLE mytable AUTO_INCREMENT = value;
orSET INSERT_ID =nilai;
Kecuali ditentukan lain, nilainya akan dimulai dengan:1000000 atau tentukan sebagai berikut:
...) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1
TIMESTAMPS:
Nilai untuk kolom TIMESTAMP dikonversi dari zona waktu saat ini ke UTC untuk penyimpanan, dan dari UTC ke zona waktu saat ini untuk pengambilan.
http://dev.mysql.com/doc/refman/5.1 /en/timestamp.html Untuk satu kolom TIMESTAMP dalam tabel, Anda dapat menetapkan stempel waktu saat ini sebagai nilai default dan nilai pembaruan otomatis.
satu hal yang harus diperhatikan ketika menggunakan salah satu jenis ini dalam klausa WHERE, yang terbaik adalah melakukanWHERE datecolumn =FROM_UNIXTIME(1057941242)dan notWHERE UNIX_TIMESTAMP(datecolumn) =1057941242.melakukan yang terakhir tidak akan mengambil keuntungan dari indeks itu kolom.
http://dev.mysql.com /doc/refman/5.1/en/date-and-time-functions.html
UNIX_TIMESTAMP()
FROM_UNIXTIME()
UTC_DATE()
UTC_TIME()
UTC_TIMESTAMP()
jika Anda mengonversi datetime ke unix timestamp di MySQL:
Dan kemudian tambahkan 24 jam ke dalamnya:
Dan kemudian mengubahnya kembali menjadi datetime secara ajaib kehilangan satu jam!
Inilah yang terjadi. Ketika mengonversi cap waktu unix kembali ke datetime, zona waktu dipertimbangkan dan kebetulan antara tanggal 28 dan 29 Oktober 2006 kami menggunakan waktu musim panas dan kehilangan satu jam.
Dimulai dengan MySQL 4.1.3, fungsi CURRENT_TIMESTAMP(), CURRENT_TIME(), CURRENT_DATE(), dan FROM_UNIXTIME() mengembalikan nilai dalam zona waktu saat ini koneksi , yang tersedia sebagai nilai variabel sistem zona waktu. Selain itu, UNIX_TIMESTAMP() mengasumsikan bahwa argumennya adalah nilai waktu-tanggal di zona waktu saat ini.
Setelan zona waktu saat ini tidak memengaruhi nilai yang ditampilkan oleh fungsi seperti UTC_TIMESTAMP() atau nilai dalam kolom DATE, TIME, atau DATETIME.
CATATAN:DI UPDATE HANYA memperbarui DateTime jika suatu bidang diubah Jika UPDATE menghasilkan tidak ada bidang yang diubah, maka DateTime TIDAK diperbarui!
Selain itu, TIMESTAMP Pertama selalu AUTOUPDATE secara default meskipun tidak ditentukan
Saat bekerja dengan Dates, saya hampir selalu convet ke Julian Date karena Data matematika kemudian menjadi masalah sederhana untuk menambah atau mengurangi bilangan bulat, dan Detik sejak Midnight untuk alasan yang sama. Jarang saya membutuhkan resolusi waktu dengan perincian yang lebih baik daripada detik.
Keduanya dapat disimpan sebagai bilangan bulat 4 byte, dan jika ruang sangat sempit dapat digabungkan ke dalam waktu UNIX (detik sejak epoch 1/1/1970) sebagai bilangan bulat tidak bertanda yang akan baik hingga sekitar 2106 sebagai:
' detik dalam 24 Jam =86400
' Integer Integer max val =2.147.483.647 - dapat menahan 68 tahun Detik
' Unsigned Integer max val =4.294.967.295 - dapat menampung 136 tahun Detik
Protokol Biner:
MySQL 4.1 memperkenalkan protokol biner yang memungkinkan nilai data non-string dikirim dan dikembalikan dalam format asli tanpa konversi ke dan dari format string. (Sangat berguna)
Selain itu, mysql_real_query() lebih cepat dari mysql_query() karena tidak memanggil strlen() untuk beroperasi pada string pernyataan.
http://dev.mysql.com/tech-resources /articles/4.1/prepared-statements.html Protokol biner mendukung pernyataan yang disiapkan sisi server dan memungkinkan transmisi nilai data dalam format asli. Protokol biner mengalami sedikit revisi selama rilis MySQL 4.1 sebelumnya.
Anda dapat menggunakan makro IS_NUM() untuk menguji apakah suatu bidang memiliki tipe numerik. Teruskan nilai tipe ke IS_NUM() dan dievaluasi ke TRUE jika bidangnya numerik:
Satu hal yang perlu diperhatikan adalah bahwa data biner BISA dikirim ke dalam kueri biasa jika Anda menghindarinya dan ingat MySQL hanya membutuhkan hanya agar garis miring terbalik dan karakter kutipan diloloskan. Jadi itu adalah cara yang sangat mudah untuk MEMASUKKAN string biner yang lebih pendek seperti sandi terenkripsi/Asin misalnya.
Server Utama:
http://www.experts-exchange.com/Database/MySQL/Q_22967482 .html
http://www.databasejournal.com/features/mysql/article.php /10897_3355201_2
HIBAH REPLIKASI BUDAK PADA . ke slave_user DIIDENTIFIKASI OLEH 'slave_password'
#Master Binary Logging Config STATEMENT causes replication
to be statement-based - default
log-bin=Mike
binlog-format=STATEMENT
server-id=1
max_binlog_size = 10M
expire_logs_days = 120
#Slave Config
master-host=master-hostname
master-user=slave-user
master-password=slave-password
server-id=2
File Log Biner harus dibaca:
http://dev.mysql.com/doc/refman /5.0/en/binary-log.html
http://www.mydigitallife.info/2007/10/06/how-to-read-mysql-binary-log-files-binlog-with-mysqlbinlog/
http://dev.mysql.com/doc/refman/5.1 /en/mysqlbinlog.html
http://dev.mysql.com/doc/refman /5.0/en/binary-log.html
http://dev.mysql.com/doc /refman/5.1/en/binary-log-setting.html
Anda dapat menghapus semua file log biner dengan pernyataan RESET MASTER, atau sebagian dari mereka dengan PURGE MASTER
--result-file=binlog.txt TrustedFriend-bin.000030
Normalisasi:
http://dev.mysql.com/tech-resources /articles/intro-to-normalization.html
Fungsi UDF
http://www.koders.com/cpp/fid10666379322B54AD41AEB0E4100D87C8CDDF1D8>
http://souptonuts.sourceforge.net/readme_mysql.htm
Tipe Data:
http://dev.mysql.com/doc/refman /5.1/en/storage-requirements.html
http://www.informit.com/articles/article.aspx ?p=1238838&seqNum=2
http://bitfilm. net/2008/03/24/saving-bytes-efisien-data-storage-mysql-part-1/
Satu hal yang perlu diperhatikan adalah bahwa pada tabel campuran dengan CHAR dan VARCHAR, mySQL akan mengubah CHAR menjadi VARCHAR
RecNum integer_type UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (RecNum)
MySQL selalu merepresentasikan tanggal dengan tahun pertama, sesuai dengan standar SQL dan spesifikasi ISO 8601
Lain-lain:
Mematikan beberapa fungsionalitas MySQl akan menghasilkan file data yang lebih kecil dan akses yang lebih cepat. Misalnya:
--datadir akan menentukan direktori data dan
--skip-innodb akan mematikan opsi inno dan menghemat 10-20 juta
Selengkapnya di sinihttp://dev.mysql.com/tech -resources/articles/mysql-c-api.html
Unduh Bab 7 - Gratis
InnoDB bersifat transaksional tetapi ada overhead kinerja yang menyertainya. Saya telah menemukan tabel MyISAM cukup untuk 90% proyek saya. Tabel non-transaction-safe (MyISAM) memiliki beberapa keunggulannya sendiri, yang semuanya terjadi karena:
tidak ada overhead transaksi:
Jauh lebih cepat
Persyaratan ruang disk yang lebih rendah
Lebih sedikit memori yang dibutuhkan untuk melakukan pembaruan
Setiap tabel MyISAM disimpan pada disk dalam tiga file. File memiliki nama yang dimulai dengan nama tabel dan memiliki ekstensi untuk menunjukkan jenis file. File .frm menyimpan format tabel. File data memiliki ekstensi .MYD (MYData). File indeks memiliki ekstensi .MYI (MYIndex).
File ini bisa disalin ke lokasi penyimpanan utuh tanpa menggunakan fitur Pencadangan Administrator MySQL yang memakan waktu (begitu juga Pemulihannya)
Triknya adalah membuat salinan file-file ini lalu DROP tabelnya. Saat Anda mengembalikan file, MySQl akan mengenalinya dan memperbarui pelacakan tabel.
Jika Anda harus Backup/Restore,
Memulihkan cadangan, atau mengimpor dari file dump yang ada bisa memakan waktu lama tergantung pada jumlah indeks dan kunci utama yang Anda miliki di setiap tabel. Anda dapat mempercepat proses ini secara dramatis dengan memodifikasi file dump asli Anda dengan mengapitnya dengan yang berikut:
SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;
.. your dump file ..
SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;
Untuk meningkatkan kecepatan reload, tambahkan perintah SQL SET AUTOCOMMIT =0; di awal file dump, dan tambahkan COMMIT; perintah sampai akhir.
Secara default, autocommit aktif, artinya setiap perintah penyisipan di file dump akan diperlakukan sebagai transaksi terpisah dan ditulis ke disk sebelum yang berikutnya dimulai. Jika Anda tidak menambahkan perintah ini, memuat ulang database besar ke InnoDB dapat memakan waktu berjam-jam...
Ukuran maksimum baris dalam tabel MySQL adalah 65.535 byte
Panjang maksimum efektif VARCHAR di MySQL 5.0.3 dan aktif =ukuran baris maksimum (65.535 byte)
Nilai VARCHAR tidak diisi saat disimpan. Spasi tambahan dipertahankan saat nilai disimpan dan diambil, sesuai dengan SQL standar.
Nilai CHAR dan VARCHAR di MySQL dibandingkan tanpa memperhatikan spasi tambahan.
Menggunakan CHAR hanya akan mempercepat akses Anda jika seluruh catatan berukuran tetap. Artinya, jika Anda menggunakan objek ukuran variabel apa pun, Anda mungkin juga membuat semuanya ukuran variabel. Anda tidak mendapatkan kecepatan dengan menggunakan CHAR dalam tabel yang juga berisi VARCHAR.
Batas VARCHAR dari 255 karakter dinaikkan menjadi 65535 karakter pada MySQL 5.0.3
Pencarian teks lengkap hanya didukung untuk tabel MyISAM.
http://dev.mysql.com/doc/refman /5.0/en/fulltext-search.html
Kolom BLOB tidak memiliki kumpulan karakter, dan pengurutan serta perbandingan didasarkan pada nilai numerik byte dalam nilai kolom
Jika mode SQL ketat tidak diaktifkan dan Anda menetapkan nilai ke kolom BLOB atau TEXT yang melebihi panjang maksimum kolom, nilai akan dipotong agar pas dan peringatan dibuat.
Perintah Berguna:
periksa mode ketat:SELECT @@global.sql_mode;
matikan mode ketat:
SET @@global.sql_mode='';
SET @@global.sql_mode='MYSQL40'
atau hapus:sql-mode="STRICT_TRANS_TABLES,...
TAMPILKAN KOLOM DARI mytable
SELECT max(namecount) SEBAGAI virtualcolumn
DARI mytable ORDER BY virtualcolumn
http://dev.mysql.com /doc/refman/5.0/en/group-by-hidden-fields.html
http://dev.mysql .com/doc/refman/5.1/en/information-functions.html#function_last-insert-id last_insert_id()
memberi Anda PK dari baris terakhir yang dimasukkan ke dalam utas saat ini max(pkcolname) memberi Anda PK terakhir secara keseluruhan.
Catatan:jika tabel kosong max(pkcolname) mengembalikan 1 mysql_insert_id() mengonversi tipe pengembalian fungsi API MySQL C asli mysql_insert_id() menjadi tipe oflong (dinamai int dalam PHP).
Jika kolom AUTO_INCREMENT Anda memiliki tipe kolom BIGINT, nilai yang dikembalikan olehmysql_insert_id() akan salah. Sebagai gantinya, gunakan fungsi SQL MySQL internal LAST_INSERT_ID() dalam kueri SQL.
http://dev.mysql .com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Perhatikan bahwa ketika Anda mencoba memasukkan data ke dalam tabel dan Anda mendapatkan kesalahan:
Unknown column ‘the first bit of data what you want to put into the table‘ in ‘field list’
menggunakan sesuatu seperti
INSERT INTO table (this, that) VALUES ($this, $that)
itu karena Anda tidak memiliki apostrof di sekitar nilai yang Anda coba tempelkan ke dalam tabel. Jadi, Anda harus mengubah kode Anda menjadi:
INSERT INTO table (this, that) VALUES ('$this', '$that')
pengingat bahwa `` digunakan untuk mendefinisikan bidang, database, atau tabel MySQL, bukan nilai;)
Kehilangan koneksi ke server selama kueri:
http://dev.mysql.com/doc/refman /5.1/en/gone-away.html
http://dev.mysql.com/doc /refman/5.1/en/packet-too-large.html
http://dev.mysql.com/doc/refman /5.0/en/server-parameters.html
http://dev.mysql.com/doc/refman /5.1/en/show-variables.html
http://dev.mysql.com/doc/refman /5.1/en/option-files.html
http://dev.mysql.com/doc/refman /5.1/en/error-log.html
Menyesuaikan Kueri
http://www.artfulsoftware.com/infotree/queries.php?&bw =1313
Yah, itu seharusnya cukup untuk mendapatkan bonus, menurut saya... Buah dari berjam-jam dan banyak proyek dengan gratis yang hebat basis data. Saya mengembangkan server data aplikasi pada platform windows kebanyakan dengan MySQL. Kekacauan terburuk yang harus saya luruskan adalah
Mimpi buruk database warisan MySQL utama
Ini membutuhkan serangkaian aplikasi untuk memproses tabel menjadi sesuatu yang berguna menggunakan banyak trik yang disebutkan di sini.
Jika menurut Anda ini sangat membantu, ucapkan terima kasih dengan memilihnya.
Baca juga artikel dan buku putih saya yang lain di:www.coastrd.com