إعدادات مختلفة في my.cnf تسبب خطأ "طول مفتاح الحد الأقصى 1000 بايت"

StackOverflow https://stackoverflow.com/questions/1731149

  •  20-09-2019
  •  | 
  •  

سؤال

تحرير: قد يكون هذا خطأ 5.0 خاص. (أنا على 5.0.83). إزالة الإعداد innodb_log_file_size تتخلص من المشكلة. مما يجعل الشعور الكامل. لا.

يجد Googling حول مشاكل مماثلة ولكن ليس متطابقة في 5.0 تم تصحيحها لاحقا.

مع إعدادات "خطأ" في my.cnf، ستعطيني "إنشاء بيان" هذا على MySQL 5.0 أن "المفتاح المحدد طويل جدا؛ طول مفتاح الأقصى هو 1000 بايت".

CREATE TABLE ReproduceTheProblem (
COLUMN_ONE varchar(200) character set utf8 default NULL,
COLUMN_TWO varchar(200) character set utf8 default NULL,  
KEY ThisKeyBreaks(COLUMN_ONE, COLUMN_TWO)  
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

في محاولة تحسين الأداء، وصلت إلى إعدادات my.cnf التي تؤدي بشكل جيد ولكن الحصول على خطأ "المفتاح طويل جدا". لدي إعدادات my.cnf التي يمكن أن تنشئ هذا المفتاح، ولكن هذا يؤدي بشكل رهيب على استيراد البيانات إلى جدول مختلف جدا جدا.

الإعدادات التي تعمل ولكنها تؤدي بشكل سيء (ولديها بعض القيم الزجاجية من محاولتي طلب إعدادات مختلفة في):

[client]
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-locking
key_buffer_size = 384M
max_allowed_packet = 1024M 
table_cache = 256
max_sp_recursion_depth=255
sort_buffer_size = 2M 
read_buffer_size = 2M 
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
myisam_max_sort_file_size = 30G
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 8
max_heap_table_size = 9900000
skip-federated
log-bin=mysql-bin
server-id   = 1

[mysqldump]
quick
max_allowed_packet = 256M

[mysql]
no-auto-rehash

[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

الإعدادات التي تؤدي بشكل جيد، ولكن أعطني خطأ طول المفتاح:

[client]
port            = 3306
socket          = /tmp/mysql.sock

[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
max_allowed_packet = 200M
table_cache = 256
query_cache_type = 1
query_cache_limit = 20M
query_cache_size = 500M
long_query_time = 2
thread_cache_size = 1000
thread_concurrency = 4
innodb_thread_concurrency = 4 
old_passwords = 1
max_connections = 1000
max_sp_recursion_depth = 255
server-id       = 0
innodb_buffer_pool_size = 800M
innodb_additional_mem_pool_size = 50M
innodb_log_file_size=50M
innodb_log_buffer_size = 200M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout =50

[mysqldump]
quick
max_allowed_packet = 200M

[mysql]
no-auto-rehash
هل كانت مفيدة؟

المحلول

لا أعتقد أن My.CNF الخاص بك له علاقة بهذا، يجب أن يكون هناك متغير آخر.

من قيود على جداول InnoDB:

الحد الأقصى لطول المفتاح الداخلي هو 3500 بايت، ولكن MySQL نفسه يقيد ذلك إلى 3072 بايت. (1024 بايت لبناء غير 64 بت قبل الميل 5.0.17، وإلى جميع البناء قبل 5.0.15.)

أنا أيضا ملاحظة علة 4541. يشير إلى حد 1000 بايت، وأنه لا توجد خطط لزيادة هذا ببساطة.

على جبهة الأداء، فستكون الفهارس الكبيرة (والجداول) مثل هذا بطيئا حقا حقا. أود أن أقترح فهرسة بادئة Varchars فقط بدلا من السلسلة بأكملها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top