嗨和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`
--
这将成为游戏常见问题/提示的网站,我确实希望稍后会有很多成员,但我想我会要求确保一切正常,再次和平。
答案 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所说的,我注意到了;
JoinedOn
列定义为ON UPDATE CURRENT_TIMESTAMP
。如果您只需要维护已加入的日期,则在更新记录时不应更新该字段。IPAddress
列为VARCHAR(80)
。如果存储IPv4类型的IP地址,这将太冗长。 ''
列的DEFAULT
空字符串(NOT NULL
)。如果打算在该领域有一个值(''
除外),那就不好了。''
字段为DEFAULT
的空字符串(UNIQUE
)。如果您打算拥有唯一价值(''
除外),这与强制执行的约束相矛盾。