DB索引大小相关问题

时间:2018-06-12 14:27:42

标签: php database indexing size

我正在与Invoice相关的项目中工作,现在我遇到了DB索引大小或与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时,它成功运作了。我在DB中直接尝试了这个。

使用:invo settings-4294967295-6数据库错误

使用:invo sett-4294967295-6成功

任何人都可以知道吗?请尽力帮助我?

2 个答案:

答案 0 :(得分:1)

我想我有理由&回答我所面临的问题&在这里,我与大家分享。

无论指定的长度如何,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。所以我必须将发票号码重置为一个小得多的数字&修复了DB中的错误。

A helpful note

Another helpful link

答案 1 :(得分:0)

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)