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

Kapan menggunakan NULL di tabel MySQL

Saya akan rewel tentang pilihan kata sejenak:

  • Bahkan jika itu adalah faktor kinerja yang signifikan, itu tidak membuatnya secara semantik benar untuk menggunakan nilai alih-alih NULL. Dalam SQL, NULL memiliki peran semantik, untuk menunjukkan nilai yang hilang atau tidak dapat diterapkan. Karakteristik kinerja NULL dalam implementasi RDBMS yang diberikan tidak tergantung pada ini. Performanya mungkin berbeda dari satu merek ke merek lain atau dari versi ke versi, tetapi tujuan NULL dalam bahasa itu konsisten.

Bagaimanapun, saya belum pernah mendengar bukti bahwa NULL berkinerja buruk. Saya tertarik pada referensi apa pun untuk pengukuran kinerja yang menunjukkan kolom yang dapat dibatalkan berkinerja lebih buruk daripada kolom yang tidak dapat dibatalkan.

Saya tidak mengatakan saya tidak salah atau itu tidak mungkin benar dalam beberapa kasus -- hanya saja tidak berarti membuat anggapan kosong. Sains tidak terdiri dari dugaan; kita harus menunjukkan bukti dengan pengukuran berulang.

Metrik juga memberi tahu Anda dengan berapa banyak kinerjanya berbeda, sehingga Anda dapat membuat penilaian tentang apakah itu sesuatu yang perlu dikhawatirkan. Artinya, dampaknya bisa terukur dan tidak nol, tetapi masih tidak signifikan dibandingkan dengan faktor kinerja yang lebih besar, seperti pengindeksan tabel dengan benar atau ukuran cache database Anda.

Di MySQL, pencarian untuk NULL bisa mendapatkan keuntungan dari indeks:

mysql> CREATE TABLE foo (
  i INT NOT NULL,
  j INT DEFAULT NULL,
  PRIMARY KEY (i),
  UNIQUE KEY j_index (j)
);

mysql> INSERT INTO foo (i, j) VALUES 
  (1, 1), (2, 2), (3, NULL), (4, NULL), (5, 5);

mysql> EXPLAIN SELECT * FROM foo WHERE i = 3;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | foo   | const | PRIMARY       | PRIMARY | 4       | const |    1 |       | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+

mysql> EXPLAIN SELECT * FROM foo WHERE j IS NULL;
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | foo   | ref  | j_index       | j_index | 5       | const |    2 | Using where | 
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+

Perhatikan bahwa itu masih bukan ukuran kinerja. Saya hanya menunjukkan bahwa Anda dapat menggunakan indeks saat mencari NULL. Saya akan menegaskan (diakui tanpa mengukur, tapi hei ini hanya StackOverflow) bahwa manfaat indeks menutupi kemungkinan penalti saat mencari NULL versus string kosong.

Ini bukan keputusan desain yang tepat untuk memilih nol atau kosong atau nilai lain apa pun untuk menggantikan NULL. Anda mungkin perlu menggunakan nilai tersebut sebagai signifikan di kolom. Itulah mengapa NULL ada, sebagai nilai yang menurut definisi di luar domain nilai dari tipe data apa pun, sehingga Anda dapat menggunakan rentang penuh nilai bilangan bulat atau string atau apa pun dan masih memiliki sesuatu untuk menandakan "tidak satu pun dari nilai di atas. "



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. kesalahan mysql:Tabel mysql.innodb_table_stats tidak ditemukan

  2. Apa itu Skema Basis Data?

  3. Kode Kesalahan:1062. Entri duplikat '1' untuk kunci 'PRIMARY'

  4. Panggil ke fungsi yang tidak ditentukan mysql_query()

  5. dapatkah saya mereset bidang auto_increment di mySql?