【发布时间】:2011-02-05 13:06:24
【问题描述】:
我有一个包含 100 万行的“items”表和一个包含 20,000 行的“users”表。当我从“items”表中选择时,我会在“users”表上进行连接(items.user_id = user.id),这样我就可以从 users 表中获取“用户名”。
我正在考虑向 items 表添加用户名列并删除连接。我可以期望从中获得可观的性能提升吗?它已经非常快了,但是减少我的负载(非常高)会很好。
不利的一面是,如果用户更改了他们的用户名,项目仍然会反映他们的旧用户名,但如果我可以期待一个可观的性能提升,这对我来说是可以的。
我之所以问 stackoverflow,是因为基准测试并没有告诉我太多。两个查询都很快完成。无论如何,我想知道删除连接是否会在很大程度上减轻数据库的负载。
连接查询示例:
选择Item.id,Item.submitter_id,Item.source_image,Item.cached_image,Item.Item,@987654331.@987654331.@9876 987654333 @。width,Item。height,Item。status,Item。popular,Item。made_popular,Item。fave_count,Item .tags, Item.user_art, Item.nudity, Item.created, Item.modified, @9876454355.,removed,@9876 987654358 @,Item。test,Item。recs,Item。recs_data,User。id,User。username,User。password ,User.email,User.fullname,User.profileurl,User.homepage,User.bio,User,@98765438@9866 987654383 @。avatar,User。ff_user,User。ff_key,User。ff_last_faveid,User。twitter_user,User。twitter_pass,User .emailalerts, User.showunsafe, User.@98765 4400 @,User 987654402 @,User 987654404 @,User 987654406 @,User 987654409 User 987654411 @。@ 987654412 User ,User 987654414 @,User 987654416 @,User items Item least join users User submitter_id 987654424 submitter_id 987654424 = User.id) 其中Item.nofront != 1 AND Item.removed != 1 AND Item.made_popular 不为 NULL AND @nudity != 1 ORDER BY 987654433@.made_popular DESC LIMIT 1040, 290;
不带连接的示例查询:
选择Item.id,Item.submitter_id,Item.source_image,Item.cached_image,Item.@98765444@,source_url,source_url,@9866 987654447 @。width,Item。height,Item。status,Item。popular,Item。made_popular,Item。fave_count,Item .tags, Item.user_art, Item.nudity, Item.created, Item.modified, Item,@9876544769@,@9876 987654472 @,Item 987654474 @,Item 987654476 recs,Item 987654479 items AS Item 987654481 Item!= 1和Item。 removed != 1 AND Item.made_popular is not NULL AND nudity != 1 ORDER BY Item.made_popular DESC LIMIT 1040, 290;
【问题讨论】:
-
当您选择 where 子句中的内容时?
-
将两个查询添加到上面的帖子中。
-
您可以为上述查询发布一个解释计划吗?看起来您正在从用户表中检索大量数据。你需要这一切吗?如果您使用 id 和 name 索引用户表,则使用连接检索 user_name 应该非常快。 MySQL 也应该很容易有效地缓存表。我希望删除每行返回的额外用户数据比删除用户表上的快速索引查找带来更大的好处。
-
雅各布泰勒,说得好。我从查询中删除了大部分用户数据和大量项目数据。我很好奇。为什么检索更少的数据会带来如此巨大的好处?是 php 问题(更大的对象 = 更多内存)还是会显着影响查询时间?好处是否足够大,以至于人们可能希望尽可能避免添加另一个表列,或者这不是什么大不了的事?
-
@makeee,如果用户名被编入索引,您可以进行连接,而无需接触真实的表格。仅获取用户名的连接可以从索引中获取该信息。这可能是最大的改进。较小的改进是“通过网络”传输更少的数据,这在网络环境中很重要,但即使对于本地数据库也可能很明显。