虽然已经自己摸索开发了好多类似日志查询页面这种需要大量将账户显示为姓名的需求,但总感觉不是最优解,问题措辞还在百度搜不到,只能到 V2EX 求教了。
以前用 PHP 写过三种方式,分别是:
1.foreach 输出表格,每行执行一条 SQL,用 UID 查账户数据库,返回姓名并输出;
2.foreach 循环前再做一个 foreach,将所有 UID 合并为一条 SQL,返回姓名数组,整理返回的每一条的 key 为 UID,后续调取$name["UID"];
3.直接在 foreach 前用一条 SQL 搬出所有账户的姓名(企业内环境,数据量不超过 1000 条),整理返回的每一条的 key 为 UID,后续调取$name["UID"]。
请问那种方法更好?或者有更好的方法?这类问题应该通过学习什么内容掌握?
1
canghai666 2021-03-08 08:16:08 +08:00
数据量不多就一次性提取出来,然后循环输出就是了,1000 次读取数据库是很慢的
|
2
jinhan13789991 2021-03-08 08:22:08 +08:00 via Android
我觉得可以考虑 nosql,对 uid 和 name 做单独映射。
|
3
Geel OP @canghai666 感谢回答,会认真参考的。
|
4
Geel OP @jinhan13789991 感谢回答,现在主要在用 mysql,会考虑使用 nosql 这个方向的
|
5
MasterCai 2021-03-08 08:36:12 +08:00
数据量不大的话还是直接全部读到内存里速度最快吧,完全可以预判一下在用户即将使用到这个数据的时候将其提前取出来
|
7
chinvo 2021-03-08 08:51:53 +08:00 via iPhone
有 uid 的话可以用 implode 拼(虽然底层实现还是循环)
|
8
junwind 2021-03-08 08:57:28 +08:00
先 sql 把用户名的表直接取出来,然后在 foreach 里面用$user[$uid]映射取用户名就行了,这样绝对比在 foreach 里面循环执行 sql 查用户名好一些;大大的减轻了 mysql 的开销
|
9
infun 2021-03-08 08:58:07 +08:00 via Android
我前领导的写法是全取出,放浏览器缓存,而且每刷新一次就 append 一次,导致一个页面占用内存超过 1G,巨慢。
|
10
junwind 2021-03-08 09:01:24 +08:00
@junwind 或者还可以优化一下,获取的用户信息中,uid 单独拿出来,看看有哪些 uid 需要获取用户名的,避免一次查所有的用户名造成浪费,select `username` from user where uid in (uid1,uid2,...) , 查出来后再循环取,可以的话,还能加个 redis 缓存,下一次取就更方便了,比较用户名这种数据,一般人也不会多次修改,做缓存很好;
|
13
dorothyREN 2021-03-08 10:12:55 +08:00
我是把日志表里面加一个用户名的字段。
|
14
Geel OP @dorothyREN 感谢回答,会认真参考的。
|
15
dorothyREN 2021-03-08 10:22:05 +08:00
@Geel #14 加一个字段,好处是查询的时候不用连表查询了。
|