Php 数据库索引大小相关问题

Php 数据库索引大小相关问题,php,database,indexing,size,Php,Database,Indexing,Size,我在一个与发票相关的项目中工作,现在我面临一个DB索引大小的问题或与索引相关的问题 索引: 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 表名:

我在一个与发票相关的项目中工作,现在我面临一个DB索引大小的问题或与
索引相关的问题

索引:

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
表名:
发票

表结构:

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\u number\u company\u unique=invo settings-4294967295-6

尝试执行下一张发票时,其中
发票\u编号\u公司\u唯一=发票设置-4294967296-6
:它开始显示数据库错误,如下所示:

“发票号\公司\唯一”关键字的重复条目“发票设置-4294967295-6”

我认为这与指数的大小有关。因为当我将
invo settings-4294967295-6
更改为
invo sett-4294967295-6
时,它成功地工作了。我已经在DB中直接尝试过了

带有:
invo设置-4294967295-6
DB错误

使用:
invo sett-4294967295-6
Success

有人知道这件事吗?请帮帮我好吗

UNIQUE KEY `invoice_number_company_unique`
     (`invoice_number_prefix`,`invoice_number`,`company_id`)
您的索引,由于连接可能太大,是否会使引擎认为两个不同的条目是重复的?您可以尝试限制发票\u编号\u前缀中的字符标记,并查看其是否有效:

删除
invoice\u number\u company\u unique
索引并再次创建它,将前缀限制为10个字符,如下所示:

CREATE INDEX invoice_number_company_unique ON invoices
     (invoice_number_prefix(10),invoice_number,company_id)

我想我已经找到了我所面临的问题的原因和答案&在这里我要和大家分享

无论指定什么长度,
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(有符号)
4294967295(无符号)

您可以看到最大范围为
4294967295
,如果您查看我的错误,很明显我的发票号达到了
invoice
表中的最大限制,其中字段类型为
int(11)

我已通过将类型更改为
bigint
进行了检查&问题已得到解决

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


好的。。我会在几个小时内检查,并让您知道我有一个更改前缀标签的自定义选项,因此我已将标签更改为
inv
。在这种情况下,错误显示也是一样的。谢谢你的帮助和建议。很高兴你做到了,这很有意义