[求助] 做日志查询页面如何用账号取数据库中的姓名?

2021-03-08 07:50:43 +08:00
 Geel

虽然已经自己摸索开发了好多类似日志查询页面这种需要大量将账户显示为姓名的需求,但总感觉不是最优解,问题措辞还在百度搜不到,只能到 V2EX 求教了。

以前用 PHP 写过三种方式,分别是:

1.foreach 输出表格,每行执行一条 SQL,用 UID 查账户数据库,返回姓名并输出;

2.foreach 循环前再做一个 foreach,将所有 UID 合并为一条 SQL,返回姓名数组,整理返回的每一条的 key 为 UID,后续调取$name["UID"];

3.直接在 foreach 前用一条 SQL 搬出所有账户的姓名(企业内环境,数据量不超过 1000 条),整理返回的每一条的 key 为 UID,后续调取$name["UID"]。

请问那种方法更好?或者有更好的方法?这类问题应该通过学习什么内容掌握?

1553 次点击
所在节点    程序员
15 条回复
canghai666
2021-03-08 08:16:08 +08:00
数据量不多就一次性提取出来,然后循环输出就是了,1000 次读取数据库是很慢的
jinhan13789991
2021-03-08 08:22:08 +08:00
我觉得可以考虑 nosql,对 uid 和 name 做单独映射。
Geel
2021-03-08 08:22:57 +08:00
@canghai666 感谢回答,会认真参考的。
Geel
2021-03-08 08:24:14 +08:00
@jinhan13789991 感谢回答,现在主要在用 mysql,会考虑使用 nosql 这个方向的
MasterCai
2021-03-08 08:36:12 +08:00
数据量不大的话还是直接全部读到内存里速度最快吧,完全可以预判一下在用户即将使用到这个数据的时候将其提前取出来
Geel
2021-03-08 08:44:43 +08:00
@MasterCai 感谢回答,会认真参考的。
chinvo
2021-03-08 08:51:53 +08:00
有 uid 的话可以用 implode 拼(虽然底层实现还是循环)
junwind
2021-03-08 08:57:28 +08:00
先 sql 把用户名的表直接取出来,然后在 foreach 里面用$user[$uid]映射取用户名就行了,这样绝对比在 foreach 里面循环执行 sql 查用户名好一些;大大的减轻了 mysql 的开销
infun
2021-03-08 08:58:07 +08:00
我前领导的写法是全取出,放浏览器缓存,而且每刷新一次就 append 一次,导致一个页面占用内存超过 1G,巨慢。
junwind
2021-03-08 09:01:24 +08:00
@junwind 或者还可以优化一下,获取的用户信息中,uid 单独拿出来,看看有哪些 uid 需要获取用户名的,避免一次查所有的用户名造成浪费,select `username` from user where uid in (uid1,uid2,...) , 查出来后再循环取,可以的话,还能加个 redis 缓存,下一次取就更方便了,比较用户名这种数据,一般人也不会多次修改,做缓存很好;
Geel
2021-03-08 09:08:31 +08:00
@infun [表情]
Geel
2021-03-08 09:09:20 +08:00
@junwind 感谢回答,会认真参考的。
dorothyREN
2021-03-08 10:12:55 +08:00
我是把日志表里面加一个用户名的字段。
Geel
2021-03-08 10:17:53 +08:00
@dorothyREN 感谢回答,会认真参考的。
dorothyREN
2021-03-08 10:22:05 +08:00
@Geel #14 加一个字段,好处是查询的时候不用连表查询了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/759426

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX