数据库索引大小相关问题



我正在与发票相关的项目中工作,现在我遇到了数据库索引大小或与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:它开始显示数据库错误,如下所示:

密钥"invoice_number_company_unique"的重复条目"invo settings-4294967295-6">

我认为这与索引的大小有关。因为当我invo settings-4294967295-6改为invo sett-4294967295-6时,它工作成功了。我直接在数据库中尝试过这个。

与:invo settings-4294967295-6数据库错误

与:invo sett-4294967295-6成功

谁能知道这件事?请试着帮助我?

我想我已经得到了我所面临的问题的原因和答案,在这里我与大家分享。

无论指定什么长度,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,如果您查看我的错误,很明显我的发票编号在字段类型为int(11)的表中invoice达到了该最大限制。

我已经通过将类型更改为bigint来检查它,并且问题已修复。

在我的项目中,将int更改为bigint是不可接受的,因此我必须将发票编号重置为更小的数字,并修复了DB的错误。

一个有用的说明

另一个有用的链接

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)

最新更新