gpt4 book ai didi

mysql - 优化很少使用的 varchar 字段

转载 作者:行者123 更新时间:2023-11-30 23:35:58 25 4
gpt4 key购买 nike

我是一名数据库知识有限的开发人员,正在尝试为新应用整合可扩展的数据库设计。任何人都可以就此问题提供任何想法,我们将不胜感激。

假设我目前有下表:

Stuff
------------
ID Integer
Attr1 Integer
Attr2 Integer
Attr3 Double
Attr4 TinyInt
Attr5 Varchar(250)

展望 future ,假设我们将在此表中拥有 5 亿条记录。但是,在任何给定时间,只有 5000 条左右的记录会在 Attr5 列中包含任何内容;所有其他记录将有一个空白或空的 Attr5 列。插入记录时,Attr5 列会填充 100-200 个字符,然后夜间进程将清除其中的数据。

我担心的是,表空间中心的如此大的 varchar 字段(否则主要包含小数字字段)会降低对表的读取效率。因此,我在徘徊是否将数据库设计更改为使用这样的两个表会更好:

Stuff
------------
ID Integer
Attr1 Integer
Attr2 Integer
Attr3 Double
Attr4 TinyInt

Stuff_Text
------------
StuffID Integer
Attr5 Varchar(250)

然后在每晚的过程中从 Stuff_Text 中删除,保持 5,000 条记录,从而使 Stuff 表的大小保持最小。

所以我的问题是:是否有必要将这张表一分为二,或者数据库引擎是否足够智能以有效地存储和访问信息?我可以看到数据库压缩数据效率并将没有数据的记录存储在 Attr5 中,就好像没有 varchar 列一样。我还可以看到数据库在每条记录中都留下了 250 字节的开放数据,以预测 Attr5 的数据。我倾向于期待前者,因为我认为这是 varchar 而不是 char 的目的,但我的数据库经验有限,所以我想我最好仔细检查一下。

我正在使用 MySQL 5.1,目前在 Windows 2000AS 上,最终升级到 Windows Server 2008 系列。数据库目前位于标准的 7200 rpm 磁盘上,最终将移动到 SSD。

最佳答案

Stuff------------ID     IntegerAttr1  IntegerAttr2  IntegerAttr3  DoubleAttr4  TinyIntAttr5  Integer NOT NULL DEFAULT 0 (build an index on this)Stuff_Text------------Attr5_id   Integer (primary key)Attr5_text Varchar(250)

In action

desc select * from Stuff WHERE Attr5<>0;

desc select Stuff.*, Stuff_text.Attr5_text
from Stuff
inner join Stuff_text ON Stuff.Attr5=Stuff_text.Attr5_id;
  1. 不要存储 NULL
  2. 使用整数作为外键
  3. 拉取记录时where Attr5 <>0 <-- scan 5,000 rows
  4. 更小的索引大小
  5. 自己做一个基准测试

关于mysql - 优化很少使用的 varchar 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7348350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com