如何为列[innodb specific]选择优化的数据类型?

Ada*_*han 16 mysql database database-design innodb

我正在学习数据库的数据类型的用法.

例如:

  • 哪个更适合电子邮件?varchar [100],char [100]或tinyint(开玩笑)
  • 哪个用户名更好?我应该使用int,bigint还是varchar?说明.我的一些朋友说,如果我们使用int,bigint或其他数字数据类型,它会更好(facebook会这样做).像u = 123400023指的是用户123400023,而不是user = thenameoftheuser.由于数字需要较少的时间来获取.
  • 哪个更适合电话号码?帖子(如博客或公告)?或者也许是日期(我使用日期时间)?也许有些人做了想分享的研究.
  • 产品价格(我用十进制(11,2),不知道你们的人)?
  • 或者你想到的任何其他东西,比如"我使用串行数据类型为blablabla".

为什么我要特别提到innodb?

除非您使用InnoDB表类型(请参阅第11章"高级MySQL"以获取更多信息),否则CHAR列的访问速度比VARCHAR快.

Inno db有一些我不知道的差异.我从这里读到.

Joh*_*hnB 15

简要总结:

(只是我的意见)

  1. 用于电邮地址 - VARCHAR(255)
  2. 用户名 - VARCHAR(100)VARCHAR(255)
  3. for id_username - use INT(除非你计划在你的系统中超过20亿用户)
  4. 电话号码 - INT或者VARCHAR或者CHAR(取决于您是否要存储格式)
  5. 帖子 - TEXT
  6. 日期 - DATEDATETIME(绝对包括帖子或电子邮件等内容的时间)
  7. 钱 - DECIMAL(11,2)
  8. misc - 见下文

至于使用InnoDB,因为VARCHAR它应该更快,我不会担心,或一般的速度.使用InnoDB是因为您需要执行事务和/或您希望使用外键约束(FK)来保证数据完整性.此外,InnoDB使用行级锁定,而MyISAM仅使用表级锁定.因此,InnoDB可以比MyISAM更好地处理更高级别的并发性.使用MyISAM来使用全文索引,并减少开销.

更重要的是速度比引擎类型:将索引放在需要快速搜索的列上.始终将索引放在ID/PK列上,例如我提到的id_username.

更多细节:

这里有一堆关于MySQL数据类型和数据库设计的问题(警告,比你要求的更多):

关于何时使用InnoDB引擎的几个问题:

我只是tinyint用于几乎所有事情(认真).

编辑 - 如何存储"帖子:"

以下是一些更详细的链接,但这里是简短版本.对于存储"帖子",您需要一个长文本字符串的空间. CHAR最大长度是255,所以这不是一个选项,当然CHAR会浪费未使用的字符VARCHAR,而不是长度可变CHAR.

在MySQL 5.0.3之前,VARCHAR最大长度为255,因此您将继续使用TEXT.但是,在较新版本的MySQL中,您可以使用VARCHARTEXT.选择取决于偏好,但有一些差异. VARCHARTEXT最大长度现在都是65,535,但您可以设置自己的最大值VARCHAR.假设您认为您的帖子最多只需要2000,您可以设置VARCHAR(2000).如果你们每个人都遇到了极限,那么你可以ALTER在以后的桌子上使用它VARCHAR(3000).另一方面,TEXT实际上将其数据存储在BLOB(1)中.我听说,有可能是之间的性能差异VARCHARTEXT,但我没有看到任何证据,所以你可能想要进一步研究,但你可以在将来改变那个细微的细节.

更重要的是,使用全文索引而不是LIKE更快地搜索此"发布"列(2).但是,您必须使用MyISAM引擎才能使用全文索引,因为InnoDB不支持它.在MySQL数据库中,每个表都可以有异构的引擎组合,因此您只需要使用MyISAM使"posts"表成为可能.但是,如果您绝对需要"帖子"来使用InnoDB(用于交易),那么设置一个触发器来更新"posts"表的MyISAM副本,并使用MyISAM副本进行所有全文搜索.

请参阅底部的一些有用的引用.

(3)"VARCHAR列中的值是可变长度字符串.长度可以指定为MySQL 5.0.3之前的0到255之间的值,5.0.3及更高版本中的0到65,535之间的值.

在MySQL 5.0.3之前,如果需要不删除尾随空格的数据类型,请考虑使用BLOB或TEXT类型.

存储CHAR值时,将它们右对齐,并使用指定长度的空格.检索CHAR值时,将删除尾随空格.

在MySQL 5.0.3之前,当存储到VARCHAR列中时,会从值中删除尾随空格; 这意味着检索到的值也没有空格."

最后,这里有一篇关于VARCHAR与TEXT的优缺点的文章.它还谈到了性能问题:

  • id不应该是INT,而是INT UNSIGNED.货币数据不应该是DECIMAL(11,2),而是DECIMAL(11,2)UNSIGNED.我建议使用Sphinx来索引MySQL FULLTEXT和MyISAM上的全文数据. (2认同)