Karena Anda memberikan hadiah, saya akan membagikan rahasia saya 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 berfungsi sama dengan MySQL. Dan bacaan saya tentang penyetelan MySQL membuat saya menyimpulkan bahwa MySQL berada di belakang Oracle dalam hal mengoptimalkan kueri.
Meskipun kueri sederhana yang diperlukan untuk sebagian besar aplikasi B2C dapat berfungsi dengan baik untuk MySQL, sebagian besar jenis kueri pelaporan agregat yang diperlukan untuk Intelligence Reporting tampaknya memerlukan sedikit perencanaan dan pengaturan ulang kueri SQL untuk memandu MySQL agar dapat mengeksekusinya lebih cepat.
Administrasi:
max_connections
adalah jumlah koneksi serentak. Nilai defaultnya adalah 100 koneksi (151 sejak 5.0) - sangat kecil.
catatan:
koneksi membutuhkan memori dan OS Anda mungkin tidak dapat menangani banyak koneksi.
Biner MySQL untuk Linux / x86 memungkinkan Anda memiliki hingga 4096 koneksi bersamaan, tetapi biner yang dikompilasi sendiri sering kali memiliki lebih sedikit batas.
Setel table_cache agar sesuai dengan jumlah tabel terbuka dan koneksi serentak Anda. Perhatikan nilai open_tables dan jika itu berkembang dengan cepat Anda perlu meningkatkan ukurannya.
catatan:
2 parameter sebelumnya mungkin membutuhkan 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, setel batas ini.
Jika Anda memiliki kueri kompleks, sort_buffer_size dan tmp_table_size sepertinya sangat penting. Nilai akan bergantung pada kompleksitas kueri dan sumber daya yang tersedia, tetapi 4Mb dan 32Mb, masing-masing adalah titik awal yang direkomendasikan.
Catatan: Ini adalah nilai "per koneksi", antara read_buffer_size, read_rnd_buffer_size dan beberapa lainnya, yang berarti bahwa nilai ini mungkin diperlukan untuk setiap koneksi. Jadi, pertimbangkan beban Anda dan sumber daya yang tersedia saat menyetel parameter ini. Misalnya sort_buffer_size dialokasikan hanya jika MySQL perlu melakukan sortir. Catatan: hati-hati jangan sampai kehabisan memori.
Jika Anda memiliki banyak koneksi yang dibuat (yaitu situs web tanpa koneksi tetap), Anda dapat meningkatkan kinerja dengan menyetel thread_cache_size ke nilai bukan nol. 16 adalah nilai yang bagus untuk memulai. Tingkatkan nilainya sampai threads_created Anda tidak tumbuh dengan sangat cepat.
KUNCI UTAMA:
Hanya boleh ada satu kolom AUTO_INCREMENT per tabel, itu harus diindeks, dan tidak boleh memiliki nilai DEFAULT
KEY biasanya merupakan sinonim untuk INDEX. Atribut kunci PRIMARY KEY juga dapat ditentukan hanya sebagai KEY ketika diberikan dalam definisi kolom. Ini diimplementasikan untuk kompatibilitas dengan sistem database lain.
A PRIMARY KEY adalah indeks unik di mana semua kolom kunci harus didefinisikan sebagai NOT NULL
Jika PRIMARY KEY atau UNIQUE index hanya terdiri dari satu kolom yang memiliki tipe integer, Anda juga dapat merujuk ke kolom tersebut 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 dapat menggunakan 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 bisa berguna jika 0 telah disimpan di kolom AUTO_INCREMENT tabel. (Ngomong-ngomong, menyimpan 0 bukanlah praktik yang disarankan.)
Untuk mengubah nilai penghitung AUTO_INCREMENT yang akan digunakan untuk baris baru:
ALTER TABLE mytable AUTO_INCREMENT = value;
atau SET INSERT_ID = value;
Kecuali ditentukan lain, nilainya akan dimulai dengan: 1000000 atau ditetapkan sebagai:
...) ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 1
TIMESTAMPS:
Nilai untuk kolom TIMESTAMP diubah 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 saat menggunakan salah satu dari jenis ini dalam klausa WHERE, yang terbaik adalah melakukan WHERE datecolumn = FROM_UNIXTIME (1057941242) dan bukan WHERE UNIX_TIMESTAMP (datecolumn) = 1057941242. melakukan yang terakhir tidak akan memanfaatkan indeks di kolom itu.
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 menjadi unix timestamp di MySQL:
Dan kemudian menambahkan 24 jam ke dalamnya:
Dan kemudian mengubahnya kembali ke datetime secara ajaib kehilangan satu jam!
Inilah yang terjadi. Ketika mengubah stempel waktu unix kembali ke datetime zona waktu dipertimbangkan dan kebetulan antara 28 dan 29 Oktober 2006 kami kehilangan 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 koneksi saat ini , yang tersedia sebagai nilai variabel sistem zona waktu . Selain itu, UNIX_TIMESTAMP () mengasumsikan bahwa argumennya adalah nilai datetime di zona waktu saat ini.
Pengaturan zona waktu saat ini tidak mempengaruhi nilai yang ditampilkan oleh fungsi seperti UTC_TIMESTAMP () atau nilai dalam kolom DATE, TIME, atau DATETIME.
CATATAN: ON UPDATE ONLY memperbarui DateTime jika bidang diubah Jika UPDATE tidak menghasilkan bidang yang diubah, maka DateTime TIDAK diperbarui!
Sebagai tambahan, TIMESTAMP Pertama selalu AUTOUPDATE secara default meskipun tidak ditentukan
Ketika bekerja dengan Tanggal, saya hampir selalu menggantungkan pada Tanggal Julian karena Data matematika kemudian merupakan masalah sederhana menambahkan atau subtracing bilangan bulat, dan Detik sejak Tengah Malam untuk alasan yang sama. Jarang saya membutuhkan waktu untuk menghasilkan perincian yang lebih halus daripada detik.
Keduanya dapat disimpan sebagai integer 4 byte, dan jika spasi sangat sempit dapat digabungkan ke dalam waktu UNIX (detik sejak epoch 1/1/1970) sebagai integer yang tidak bertanda tangan yang akan baik hingga sekitar 2106 sebagai:
detik dalam 24 Jam = 86400
'Signed Integer max val = 2.147.483.647 - dapat menampung 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 daripada 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 bidang memiliki tipe numerik. Teruskan nilai type ke IS_NUM () dan nilai tersebut dievaluasi TRUE jika bidangnya numerik:
Satu hal yang perlu diperhatikan adalah bahwa data biner DAPAT dikirim di dalam kueri biasa jika Anda menghindarinya dan ingat MySQL hanya memerlukan garis miring terbalik dan karakter kutipan yang akan di-escape. Jadi itu adalah cara yang sangat mudah untuk MEMASUKKAN string biner yang lebih pendek seperti kata sandi yang dienkripsi / Salted misalnya.
Server Utama:
http://www.experts-exchange.com/Database/MySQL/Q_22967482.html
http://www.databasejournal.com/features/mysql/article.php/10897_3355201_2
HIBAHKAN REPLIKASI . 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 membaca:
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/fid10666379322B54AD41AEB0E4100D87C8CDDF1D8C.aspx
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-efficient-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:
Menonaktifkan beberapa fungsi MySQl akan menghasilkan file data yang lebih kecil dan akses yang lebih cepat. Sebagai contoh:
--datadir akan menentukan direktori data dan
--skip-innodb akan mematikan opsi inno dan menghemat 10-20M
Selengkapnya di sini
http://dev.mysql.com/tech-resources/articles/mysql-c-api.html
Unduh Bab 7 - Gratis
InnoDB bersifat transaksional tetapi ada overhead kinerja yang menyertainya. Saya merasa tabel MyISAM cukup untuk 90% proyek saya. Tabel non-transaksi-aman (MyISAM) memiliki beberapa keunggulannya sendiri, yang semuanya terjadi karena:
tidak ada overhead transaksi:
Lebih cepat
Persyaratan ruang disk yang lebih rendah
Lebih sedikit memori yang dibutuhkan untuk melakukan pembaruan
Setiap tabel MyISAM disimpan di 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-file ini dapat disalin ke lokasi penyimpanan secara utuh tanpa menggunakan fitur Cadangan Administrator MySQL yang memakan waktu (begitu juga Pemulihan)
Caranya adalah membuat salinan dari file-file ini kemudian DROP tabelnya. Saat Anda mengembalikan file, MySQl akan mengenalinya dan memperbarui tabel pelacakan.
Jika Anda harus Backup / Restore,
Memulihkan cadangan, atau mengimpor dari file dump yang ada dapat memakan waktu lama bergantung 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 mengelilinginya dengan yang berikut:
SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;
.. your dump file ..
SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;
Untuk sangat 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 dalam 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 bisa memakan waktu berjam-jam ...
Ukuran maksimum baris dalam tabel MySQL adalah 65.535 byte
Panjang maksimum efektif VARCHAR di MySQL 5.0.3 dan on = ukuran baris maksimum (65.535 byte)
Nilai VARCHAR tidak empuk saat disimpan. Ruang jejak dipertahankan ketika 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 record berukuran tetap. Artinya, jika Anda menggunakan objek ukuran variabel, Anda mungkin juga membuat semuanya ukuran variabel. Anda tidak mendapatkan kecepatan dengan menggunakan CHAR dalam tabel yang juga berisi VARCHAR.
Batas VARCHAR 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 himpunan 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 tersebut akan dipotong agar pas dan peringatan akan dibuat.
Perintah Berguna:
periksa mode ketat: PILIH @@ 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
PILIH 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 dalam utas saat ini maks (pkcolname) memberi Anda PK terakhir secara keseluruhan.
Catatan: jika tabel kosong max (pkcolname) mengembalikan 1 mysql_insert_id () mengubah jenis kembali dari fungsi MySQL C API asli mysql_insert_id () menjadi jenis panjang (dinamai int dalam PHP).
Jika kolom AUTO_INCREMENT Anda memiliki tipe kolom BIGINT, nilai yang dikembalikan oleh mysql_insert_id () tidak akan benar. Sebagai gantinya, gunakan fungsi MySQL SQL 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 menentukan bidang MySQL, database, atau tabel, 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
Pertanyaan Penyelarasan
http://www.artfulsoftware.com/infotree/queries.php?&bw=1313
Itu seharusnya cukup untuk mendapatkan bonus, saya akan berpikir ... Buah dari berjam-jam dan banyak proyek dengan database gratis yang hebat . Saya mengembangkan server data aplikasi pada platform windows kebanyakan dengan MySQL. Kekacauan terburuk yang harus saya selesaikan adalah
Mimpi buruk pamungkas database MySQL legacy
Ini membutuhkan serangkaian aplikasi untuk memproses tabel menjadi sesuatu yang berguna dengan menggunakan banyak trik yang disebutkan di sini.
Jika menurut Anda ini sangat membantu, ungkapkan terima kasih Anda dengan memberikan suara.
Lihat juga artikel dan kertas putih saya yang lain di: www.coastrd.com