我有一张叫会员的桌子。我正在寻求如何改进它的建议。
(indexed)
suspended_note; first_name; last_name; date_time; ip; gender; websiteurl; msn; aim; yim; twitter可以是空的,因为注册时只需要用户名、电子邮件和密码,所以这些字段将是空的,直到填写(它们基本上是可选的,而不是必需的),而不是在注册/登录时使用的ip。
有人能根据我给出的信息告诉我如何更有效地改进和修改这个表格吗?我会说我可以改进它,因为我倾向于在大多数事情上使用varchar,并且希望从中获得最好的性能。
我倾向于在会话中选择和存储用户数据,以避免每次查询数据库。用户名是唯一的,索引像id一样,因为我的大多数选择,比较,其中有用户名,在我的查询限制1。
更新:
我想问一下,如果我更改为enum,我将如何进行选择和比较查询,例如在php中的enum?我确实在线查看过,但找不到任何使用枚举的示例查询。另外,如果我将date_time更改为时间戳,是否仍然使用php中的time()将unix时间戳插入到date_time列数据库中?
我问的原因是,我在网上阅读了一篇教程,其中说,当行被查询、选中、更新等时,MySQL会自动更新该行的时间戳;这是真的吗?因为我宁愿在时间戳字段中使用php time()插入时间戳。对于date_time,我已经使用了php (),但目前使用的是varchar,而不是时间戳。
另外,服务器时间在美国,在php.ini中,我将其设置为英国时间,但我猜mysql会将其存储在服务器上的时间中,这也是不好的,因为我希望它们在英国时间。
发布于 2011-02-24 13:03:00
一些小贴士:
char而不是varchar。在这方面有很多讨论,但虽然varchar确实帮助您减少了规模,但这在大多数情况下并不是一个大问题。char可以更快。不过,这是个棘手的问题。timestamp。在我看来,last_visitedint(5)可能容纳的太多了。所以,如果你的失败数是最多4,你不需要那么大的数字!一个tinyint可以容纳o 127签名,或255个未签名。评论中的说明:
--您可能可以规范一些字段:经常更新的字段,如failed_login_count、ip、last_visited可能位于另一个表中。这样,您的成员表本身就不会像以前那样频繁变化,并且可以在缓存中。
(我同意这点:)
编辑:一些更新后,你的新问题。
示例如何进行选择和比较查询,例如在php中?
您可以将其与值进行比较,就好像它是一个字符串一样。唯一的区别是,对于insert或update,您只能使用给定值。只管用
SELECT * FROM table WHERE table.enum = "yourEnumOption"例如,
将date_time更改为时间戳,我是否仍然使用php中的time()将unix时间戳插入到date_time列数据库中?
你可以在mysql中使用now()吗?(这仅仅是我头上的一个小错误,可能有个小错误,但是:
INSERT INTO table (yourTime) VALUES (NOW());的原因是,我在网上阅读了一篇教程,其中说当行被查询、选择、更新等时,MySQL会自动更新该行的时间戳;这是真的吗,因为我宁愿在时间戳字段中使用php ()插入时间戳。对于date_time,我已经使用了php (),但目前使用的是varchar,而不是时间戳。
您可以使用php时间。时间戳不会自动更新,请参阅手册(http://dev.mysql.com/doc/refman/5.0/en/timestamp.html):您将在定义中使用如下内容:
CREATE TABLE t (
ts1 TIMESTAMP DEFAULT 0,
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP)发布于 2011-02-24 13:11:17
首先,应该在字段类型中使用mysql的内置类型:
状态为ENUM(“激活”、“暂停”、“验证”),'delete');
1. add an index on username and password (combined) so that logins are faster
2. index, unique email since you'll query by it to retrieve pwds and it should be unique
另外,您可能希望将此表规范化,并将suspended_note、网站、IP、aim等单独的表设置为一个名为profile的表。这样,登录、会话更新、pwd检索都是在一个小得多的表中运行的查询,其余的数据只在需要有配置文件/成员页这样的数据的页面中选择。
然而,这往往会有很大的变化,这取决于你的应用程序是如何思考,但一般来说,它更好的做法是正常化。
--您可能会更加规范化,并且也有一个user_stats表:经常更新的字段(如failed_login_count、ip、last_visited )可能位于另一个表中。这样,您的成员表本身就不会像以前那样频繁地更改,并且可以在缓存中。-1小时前的科纳克
VARCHAR是好的,但是当您知道像激活键这样的东西的大小时,总是32,然后使用CHAR(32)
发布于 2011-02-24 14:23:45
首先是基础..。
IP应该以无符号INT的形式存储,您可以使用INET_ATON和INET_NTOA来检索和存储IP。
状态可以是枚举,也可以是微小的1/0。
对于上次访问,您可以使用mysql函数UNIX_TIMESTAMP (将其存储在时间戳列中)插入unix时间戳。要检索日期,可以使用FROM_UNIXTIME函数。
大多数答案都涉及到使用Enum's的基本知识。然而,使用1表示男性和2对女性可能会加快您的应用程序,因为数字字段可能比字母数字字段更快,如果您在该字段进行大量查询。你应该测试一下才能知道。
其次,我们需要知道你是如何使用这张桌子的。您的应用程序是如何查询表的?你的索引在哪里?你在用MyISAM吗?因诺德?等等,我的大部分建议都是基于你的应用程序是如何上桌的。这张桌子也很宽,所以正如其他人所指出的那样,我会考虑将它正常化。
https://stackoverflow.com/questions/5104972
复制相似问题