Проблема с размером индекса БД - PullRequest
0 голосов
/ 12 июня 2018

Я работаю в проекте, связанном с Invoice, сейчас у меня проблема с размером индекса БД или чем-то связанным с index.

Индекс:

Keyname: invoice_number_company_unique
Type: BTREE
Unique: Yes 
Packed: No  
Column: invoice_number_prefix, invoice_number, company_id
Cardinality: 256, 768, 768
Collation: A, A, A
Null: Yes, Yes, No

Имя таблицы: invoices

Структура таблицы:

CREATE TABLE IF NOT EXISTS `invoices` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `invoice_number_prefix` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `invoice_number` int(12) unsigned DEFAULT NULL,
  `company_id` int(11) unsigned NOT NULL,
  `amount` decimal(13,2) NOT NULL DEFAULT '0.00' COMMENT 'Invoice Total'
   PRIMARY KEY (`id`),
   UNIQUE KEY `invoice_number_company_unique`
     (`invoice_number_prefix`,`invoice_number`,`company_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

Данные вставлялись до: invoice_number_company_unique = invo settings-4294967295-6

При попытке сделать следующий счетгде invoice_number_company_unique = invo settings-4294967296-6: начинает отображаться ошибка БД, как показано ниже:

Дублирующая запись 'invo settings-4294967295-6' для ключа 'invoice_number_company_unique'

Я думаюэто связано с размером индекса.Потому что, когда я изменил invo settings-4294967295-6 на invo sett-4294967295-6, он работал успешно.Я пробовал это непосредственно в БД.

С: invo settings-4294967295-6 Ошибка БД

С: invo sett-4294967295-6 Успех

Может кто-нибудь знать об этом?Пожалуйста, попробуйте мне помочь?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Я думаю, что у меня есть причина и ответ на вопрос, с которым я столкнулся, и здесь я делюсь этим со всеми вами.

Значение INT всегда будет 4 байта независимо от его длины

TINYINT = 1 byte (8 bit)
SMALLINT = 2 bytes (16 bit)
MEDIUMINT = 3 bytes (24 bit)
INT = 4 bytes (32 bit)
BIGINT = 8 bytes (64 bit).

Длина просто указывает, сколько символов отображать при выборе данных с помощью клиента командной строки mysql.

Максимальное значение будет 2147483647 (Signed) или 4294967295 (Unsigned).

Вы можете увидеть этот максимальный диапазон как 4294967295, если вы посмотрите на мою ошибку, ясно, что мой номер счета-фактуры достиг этого максимума.ограничение в таблице invoice, где тип поля равен int(11).

Я проверил его, изменив тип на bigint и проблема была исправлена.

Изменение int на bigint неприемлемо в моем проекте, поэтому мне нужно сбросить номер счета-фактуры на гораздо меньший номер, и это исправило ошибку из БД.

Полезное примечание

Еще одна полезная ссылка

0 голосов
/ 12 июня 2018
UNIQUE KEY `invoice_number_company_unique`
     (`invoice_number_prefix`,`invoice_number`,`company_id`)

Ваш индекс, в результате конкатенации, может быть слишком большим, может ли это быть причиной того, что движок считает две разные записи дублированными?Вы можете попробовать ограничить токен символов из invoice_number_prefix и посмотреть, работает ли он:

удалить индекс invoice_number_company_unique и создать его снова, ограничив префикс 10 символами, например:

CREATE INDEX invoice_number_company_unique ON invoices
     (invoice_number_prefix(10),invoice_number,company_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...