Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

# 1071 - Khóa được chỉ định quá dài; độ dài khóa tối đa là 1000 byte

Như @Devart nói, tổng độ dài chỉ mục của bạn quá dài.

Câu trả lời ngắn gọn là bạn không nên lập chỉ mục các cột VARCHAR dài như vậy, vì chỉ mục sẽ rất cồng kềnh và không hiệu quả.

Cách tốt nhất là sử dụng chỉ mục tiền tố vì vậy bạn chỉ lập chỉ mục một chuỗi con bên trái của dữ liệu. Hầu hết dữ liệu của bạn dù sao cũng sẽ ngắn hơn 255 ký tự rất nhiều.

Bạn có thể khai báo độ dài tiền tố cho mỗi cột khi bạn xác định chỉ mục. Ví dụ:

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

Nhưng độ dài tiền tố tốt nhất cho một cột nhất định là bao nhiêu? Đây là một phương pháp để tìm hiểu:

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`;

Nó cho bạn biết tỷ lệ các hàng không có nhiều hơn độ dài chuỗi nhất định trong menu_link cột. Bạn có thể thấy đầu ra như thế này:

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

Điều này cho bạn biết rằng 80% chuỗi của bạn có ít hơn 20 ký tự và tất cả các chuỗi của bạn có ít hơn 50 ký tự. Vì vậy, không cần phải lập chỉ mục nhiều hơn độ dài tiền tố là 50 và chắc chắn không cần lập chỉ mục với độ dài đầy đủ là 255 ký tự.

Tái bút:INT(1)INT(32) kiểu dữ liệu chỉ ra một sự hiểu lầm khác về MySQL. Đối số số không có tác dụng liên quan đến lưu trữ hoặc phạm vi giá trị được phép cho cột. INT luôn là 4 byte và nó luôn cho phép các giá trị từ -2147483648 đến 2147483647. Đối số số là về giá trị đệm trong khi hiển thị, không có tác dụng trừ khi bạn sử dụng ZEROFILL tùy chọn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. chọn số lượng (*) từ bảng mysql trong php

  2. mysql kiểm tra xem các số có trong danh sách được phân tách bằng dấu phẩy không

  3. MySQL INSERT IF (câu lệnh if tùy chỉnh)

  4. Sự khác biệt giữa INSERT và UPDATE trong MySQL là gì?

  5. Cách tạo MySQL View