什么对成员数据库更好?

时间:2011-07-23 08:21:58

标签: mysql database

嗨和thanx阅读我的帖子我在mysql中学习我的数据库有点麻烦。 现在我已经设置了但是最近,但我有另一个人告诉我,如果我打算有很多成员,我的会员表很慢而且没用!

我已经看了很多次并做了一些谷歌搜索,但我没有看到任何问题,也许是因为我是新手?你们其中一位sql专家可以查看它,并告诉我它有什么问题,请:)

--
-- Table structure for table `members`
--

CREATE TABLE IF NOT EXISTS `members` (
  `userid` int(9) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL DEFAULT '',
  `password` longtext,
  `email` varchar(80) NOT NULL DEFAULT '',
  `gender` int(1) NOT NULL DEFAULT '0',
  `ipaddress` varchar(80) NOT NULL DEFAULT '',
  `joinedon` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `acctype` int(1) NOT NULL DEFAULT '0',
  `acclevel` int(1) NOT NULL DEFAULT '0',
  `birthdate` date DEFAULT NULL,
  `warnings` int(1) NOT NULL DEFAULT '0',
  `banned` int(1) NOT NULL DEFAULT '0',
  `enabled` int(1) NOT NULL DEFAULT '0',
  `online` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`userid`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `emailadd` (`emailadd`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;

--
-- Dumping data for table `members`
--

这将成为游戏常见问题/提示的网站,我确实希望稍后会有很多成员,但我想我会要求确保一切正常,再次和平。

3 个答案:

答案 0 :(得分:3)

对方是否解释了为什么他们认为这是缓慢无用的?

以下是我认为可以改进的一些事项:

email应该更长一段时间 - 对于大多数电子邮件地址而言,320应该足够长,但你可能想看一下。

如果int(1)字段是简单的开/关字段,则可以是tinyint(1)bool

正如@cularis指出的那样,ipaddress字段可能不是合适的类型。对于IPv4,INT UNSIGNED优于varchar。您可以使用INET_ATON()INET_NTOA()进行转换。参见:

Best Field Type for IP address?
How to store IPv6-compatible address in a relational database

正如@Delan Azabani指出的那样,您的password字段对于您存储的值来说太长了。 MD5生成一个32个字符的字符串,因此varchar(32)就足够了。您可以切换到更安全的SHA2,并使用MySQL 'SHA2()'函数。

使用InnoDB数据库引擎代替MyISAM。它提供外键约束,行级锁定和事务等。请参阅Should you move from MyISAM to Innodb ?

答案 1 :(得分:1)

我认为这不一定很慢,但我注意到在您使用varchar的所有其他文本字段中,您使用longtext作为密码字段。这似乎是您要将密码存储在数据库中 - 不要这样做!

始终使用用户密码的固定长度加密哈希(例如,使用SHA-1或SHA-2),并将其放入数据库中。这样,如果您的数据库服务器受到威胁,则不会公开用户的密码。

答案 2 :(得分:1)

除了@Delan所说的,我注意到了;

  1. JoinedOn列定义为ON UPDATE CURRENT_TIMESTAMP。如果您只需要维护已加入的日期,则在更新记录时不应更新该字段。
  2. IPAddress列为VARCHAR(80)。如果存储IPv4类型的IP地址,这将太冗长。
  3. ''列的DEFAULT空字符串(NOT NULL)。如果打算在该领域有一个值(''除外),那就不好了。
  4. ''字段为DEFAULT的空字符串(UNIQUE)。如果您打算拥有唯一价值(''除外),这与强制执行的约束相矛盾。