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

#1071 - Kunci yang ditentukan terlalu panjang; panjang kunci maksimal adalah 1000 byte

Seperti yang dikatakan @Devart, panjang total indeks Anda terlalu panjang.

Jawaban singkatnya adalah Anda tidak boleh mengindeks kolom VARCHAR yang begitu panjang, karena indeksnya akan sangat besar dan tidak efisien.

Praktik terbaik adalah menggunakan indeks awalan jadi Anda hanya mengindeks substring kiri data. Sebagian besar data Anda akan jauh lebih pendek dari 255 karakter.

Anda dapat mendeklarasikan panjang awalan per kolom saat Anda menentukan indeks. Misalnya:

...
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
...

Tapi berapa panjang awalan terbaik untuk kolom tertentu? Berikut cara untuk mengetahuinya:

SELECT
 ROUND(SUM(LENGTH(`menu_link`)<10)*100/COUNT(`menu_link`),2) AS pct_length_10,
 ROUND(SUM(LENGTH(`menu_link`)<20)*100/COUNT(`menu_link`),2) AS pct_length_20,
 ROUND(SUM(LENGTH(`menu_link`)<50)*100/COUNT(`menu_link`),2) AS pct_length_50,
 ROUND(SUM(LENGTH(`menu_link`)<100)*100/COUNT(`menu_link`),2) AS pct_length_100
FROM `pds_core_menu_items`;

Ini memberi tahu Anda proporsi baris yang tidak lebih dari panjang string tertentu di menu_link kolom. Anda mungkin melihat output seperti ini:

+---------------+---------------+---------------+----------------+
| pct_length_10 | pct_length_20 | pct_length_50 | pct_length_100 |
+---------------+---------------+---------------+----------------+
|         21.78 |         80.20 |        100.00 |         100.00 |
+---------------+---------------+---------------+----------------+

Ini memberi tahu Anda bahwa 80% string Anda kurang dari 20 karakter, dan semua string Anda kurang dari 50 karakter. Jadi tidak perlu mengindeks lebih dari panjang awalan 50, dan tentu saja tidak perlu mengindeks panjang penuh 255 karakter.

PS:INT(1) dan INT(32) tipe data menunjukkan kesalahpahaman lain tentang MySQL. Argumen numerik tidak berpengaruh terkait penyimpanan atau rentang nilai yang diizinkan untuk kolom. INT selalu 4 byte, dan selalu memungkinkan nilai dari -2147483648 hingga 2147483647. Argumen numerik adalah tentang mengisi nilai selama tampilan, yang tidak berpengaruh kecuali Anda menggunakan ZEROFILL pilihan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memigrasikan MySQL ke PostgreSQL di AWS RDS, Bagian 4

  2. Tidak dapat terhubung ke server MySQL lokal melalui soket '/var/mysql/mysql.sock' (38)

  3. Cara Menginstal MySQL Di Ubuntu

  4. Membuat perubahan pada beberapa catatan berdasarkan perubahan satu catatan dengan SQL

  5. MySQL Hapus Duplikat Catatan