Mysql 什么';s对于成员数据库更好?

Mysql 什么';s对于成员数据库更好?,mysql,database,Mysql,Database,您好,谢谢您阅读我的帖子,我在学习mysql数据库时遇到了一些问题。 现在我已经设置好了,但最近,我有另一个人告诉我,如果我打算有很多成员,我的成员表是缓慢和无用的 我已经看过很多次了,也做过一些谷歌搜索,但我没有发现它有什么问题,也许是因为我是新手吧?你们中的一位sql专家能否仔细检查一下,并告诉我它有什么问题:) 这将是一个游戏常见问题解答/提示的网站,我确实希望以后能有很多会员,但我想我会要求确保一切正常,然后再次和平。我不认为它一定很慢,但我确实注意到,在使用varchar的所有其他文本

您好,谢谢您阅读我的帖子,我在学习mysql数据库时遇到了一些问题。 现在我已经设置好了,但最近,我有另一个人告诉我,如果我打算有很多成员,我的成员表是缓慢和无用的

我已经看过很多次了,也做过一些谷歌搜索,但我没有发现它有什么问题,也许是因为我是新手吧?你们中的一位sql专家能否仔细检查一下,并告诉我它有什么问题:)


这将是一个游戏常见问题解答/提示的网站,我确实希望以后能有很多会员,但我想我会要求确保一切正常,然后再次和平。

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


始终获取用户密码的固定长度加密哈希(例如,使用SHA-1或SHA-2),并将其放入数据库。这样,如果您的数据库服务器被破坏,用户的密码就不会暴露。

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


始终获取用户密码的固定长度加密哈希(例如,使用SHA-1或SHA-2),并将其放入数据库。这样,如果您的数据库服务器被破坏,用户的密码就不会暴露。

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

  • JoinedOn
    列在更新当前时间戳时定义为
    。如果只需要维护加入日期,则不应在更新记录时更新字段
  • IPAddress
    列是
    VARCHAR(80)
    。如果存储IPv4类型的IP地址,这将太长
  • 空字符串(
    “”
    )作为
    非空列的
    默认值
    。如果目的是在字段上有一个值(而不是
    '
    ),则不好
  • 空字符串(
    “”
    )作为
    唯一字段的
    默认值
    。如果您的意图是拥有唯一的值(而不是
    '
    ),则这与强制执行的约束相矛盾

  • 除了@Delan所说的之外,我注意到:

  • JoinedOn
    列在更新当前时间戳时定义为
    。如果只需要维护加入日期,则不应在更新记录时更新字段
  • IPAddress
    列是
    VARCHAR(80)
    。如果存储IPv4类型的IP地址,这将太长
  • 空字符串(
    “”
    )作为
    非空列的
    默认值
    。如果目的是在字段上有一个值(而不是
    '
    ),则不好
  • 空字符串(
    “”
    )作为
    唯一字段的
    默认值
    。如果您的意图是拥有唯一的值(而不是
    '
    ),则这与强制执行的约束相矛盾

  • 另一个人是否解释了为什么他们认为这是缓慢和无用的

    以下是一些我认为可以改进的地方:

    电子邮件
    应该更长一些——从我的头顶上看,320应该足够长,可以容纳大多数电子邮件地址,但你可能想查一下

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

    正如@cularis指出的,
    ipaddress
    字段可能不是合适的类型<对于IPv4,code>INT UNSIGNED
    优于varchar。您可以使用和进行转换。见:


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


    研究使用数据库引擎而不是MyISAM。它提供外键约束、行级锁定和事务等功能。请看。

    另一个人是否解释了为什么他们认为这是缓慢和无用的

    以下是一些我认为可以改进的地方:

    电子邮件
    应该更长一些——从我的头顶上看,320应该足够长,可以容纳大多数电子邮件地址,但你可能想查一下

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

    正如@cularis指出的,
    ipaddress
    字段可能不是合适的类型<对于IPv4,code>INT UNSIGNED
    优于varchar。您可以使用和进行转换。见:


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


    研究使用数据库引擎而不是MyISAM。它提供外键约束、行级锁定和事务等功能。请参阅。

    您使用
    ipaddress
    字段的目的是什么?我使用它有几种不同的功能,一种是将其与数据库中存储的已准备就绪的功能进行检查,因此如果不匹配,它们将达到5“try”登录页面上的限制将自动禁止它们。您使用
    ipaddress
    字段做什么?我使用它有几种不同的功能,一种是将其与数据库中存储的已准备就绪的功能进行检查,因此如果不匹配,并且它们达到登录页面上的5“try”限制,它将自动禁止它们。嗨,是的,我正在存储pa
    --
    -- 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`
    --