Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL mendefinisikan kolom sebagai UNIK dengan AUTO_INCREMENT alih-alih sebagai Kunci Utama

Mendefinisikan MySQL tanpa eksplisit kunci utama adalah ide yang sangat sangat buruk.
Jika PK hilang, MySQL akan membuat kunci utama peningkatan otomatis integer implisit (tetapi sangat nyata).
PK ini akan disertakan di setiap kunci sekunder di InnoDB dan akan menentukan urutan sortir utama Anda di MyISAM.

Konsekuensi
Anda baru saja memperlambat kinerja setiap pemilihan, penyisipan, dan pembaruan.
Tanpa tujuan apa pun.

InnoDB:pencarian ekstra diperlukan untuk mendapatkan data tabel
Di InnoDB, pencarian tambahan perlu dilakukan, karena semua indeks sekunder merujuk ke PK dan bukan ke baris itu sendiri.

MyISAM:ruang yang terbuang
Di MyISAM hukumannya tidak terlalu besar, tetapi Anda masih menyeret bidang 4 byte yang tidak digunakan yang tidak digunakan.

InnoDB + MyISAM:Pembuatan bidang peningkatan otomatis yang tidak berguna
Karena PK peningkatan otomatis implisit dibuat, dan Anda juga memerlukan kunci peningkatan otomatis tambahan untuk melakukan penggabungan; Untuk mencegah duplikat bidang peningkatan otomatis, Anda sekarang tidak memiliki 1, tetapi 2 kunci tabel per sisipan.

InnoDB:dengan bergabung dengan probe pencarian yang disebutkan di atas ganda
Jika Anda melakukan join menggunakan field yang bukan PK, InnoDB perlu melakukan pencarian ekstra per join untuk mendapatkan catatan dari tabel lain itu.

InnoDB:yang terburuk, Anda kehilangan manfaat dari menutupi indeks
Anda telah menonaktifkan salah satu pengoptimalan terbaik di InnoDB, yang mencakup indeks.
Jika MySQL dapat menyelesaikan kueri hanya menggunakan data dalam indeks, ia tidak akan pernah membaca tabel, ini akan menghasilkan kecepatan yang signifikan memperoleh. Sekarang 50% dari setiap indeks di InnoDB adalah ruang yang tidak digunakan, Anda baru saja mengurangi peluang Anda untuk menggunakan pengoptimalan tersebut.

Harap kalahkan kontraktor ini dengan tongkat petunjuk!

Tautan:
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/ (tautan lambat, tetapi merekomendasikan membaca).
O'Reilly pada indeks cakupan InnoDB http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB

BTW , jika kontraktor Anda mengatakan, itu tidak masalah karena dia menggunakan MyISAM, kalahkan dia lagi, Anda harus selalu menggunakan InnoDB kecuali Anda memiliki alasan yang kuat untuk tidak melakukannya.
InnoDB jauh lebih aman dalam produksi, MyISAM memilikinya digunakan tetapi terlalu mudah rusak.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Permintaan MySQL Pilih, SUM, LEFT JOIN

  2. MySQL - Mengambil nilai terendah

  3. Tomcat 6.0.24 Pengecualian:Tidak dapat memuat com.mysql.jdbc.SQLError

  4. Tab dinamis menyajikan catatan yang sama

  5. Perbarui kolom berdasarkan nilai yang cocok di tabel lain di mysql