【问题标题】:DB index size related issue数据库索引大小相关问题
【发布时间】:2018-11-21 23:55:21
【问题描述】:

我正在从事与发票相关的项目,现在我面临数据库索引大小或与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:它开始显示如下 DB 错误:

键“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 成功

有人知道吗?请尝试帮助我?

【问题讨论】:

    标签: php database indexing size


    【解决方案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,如果您查看我的错误,很明显我的发票编号已达到该最大值。字段类型为int(11)invoice 表中的限制。

    我已通过将类型更改为 bigint 进行检查,问题已修复。

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

    A helpful note

    Another helpful link

    【讨论】:

    • 很高兴你做到了,很有意义
    【解决方案2】:
    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)
    

    【讨论】:

    • 好的..我会在几个小时内检查并告诉你
    • 我有一个自定义选项来更改前缀标签,因此我将标签更改为inv。在这种情况下,错误显示也是一样的。
    • 感谢您的帮助和建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2022-10-23
    • 2010-09-05
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多