前端每秒刷新的 PHP 接口文件,取同一数据库 5 张不同表里面的数据。

2016-09-12 15:05:40 +08:00
 pyengwoei
是用在一个 PHP 文件里面去把五张表的数据取好,然后组合成一个 string 返回给前端,还是做成 5 个 PHP 文件,每次取一张表数据分别返回好?
我现在是用的前面的方法,但是感觉有部分表里面的数据很慢,不及时。
难道是我 SQL 语句的问题吗?
$shoehistory=mysql_query("select * from table1 ORDER BY id DESC LIMIT 0,1 ");
$current=mysql_query("select * from table2 ORDER BY id DESC LIMIT 0,1 ");
$time=mysql_query("select * from table3 ORDER BY id DESC LIMIT 0,1 ");
$gamestatus=mysql_query("select * from table4 ORDER BY id DESC LIMIT 0,1 ");
$jieguo = "";
while ($row=mysql_fetch_array($shoehistory)) {
//echo $row[6];
$jieguo=$row[6];
}
while ($row=mysql_fetch_array($current)) {
//echo "|".$row[7]."#".$row[8]."#".$row[9]."#".$row[10]."#".$row[11]."#".$row[12];
$jieguo = $jieguo. "|".$row[7]."#".$row[8]."#".$row[9]."#".$row[10]."#".$row[11]."#".$row[12];
}
while($row2=mysql_fetch_array($time)){
//echo "|".$row2[5];
$jieguo = $jieguo. "|".$row2[5];
}
while ($row=mysql_fetch_array($gamestatus)) {
$jieguo = $jieguo. "|". $row[7];
//echo $row[7];
}
echo $jieguo;
4112 次点击
所在节点    程序员
37 条回复
sherlocktheplant
2016-09-12 17:27:58 +08:00
加一层内存缓存就好了 反正只需要最新数据 插入数据的时候再更新内存缓存
或者直接磁盘缓存也可以 直接把需要的结果写到磁盘里的一个或者五个文件里 如果是一个文件就需要自己定格式 简单的格式就是换行符分割数据 跟内存数据一样 其他地方插入数据的时候 除了入库还需要更新缓存文件
mengxy
2016-09-12 17:43:35 +08:00
@former 呵呵,您真厉害,还知道 websocket 呢,也不看看人家问的问题到底是什么
laobaozi
2016-09-12 17:43:55 +08:00
缓存结果是指 将 select 得到的结果用文件或者内存缓存,以文件缓存为例:
1.创建一个文件缓存的方法, 定义
AddFileCache()
GetFileCache()
DelFileCache()
三个方法,以表名为参数;

2.在接到请求时,首先调用尝试从缓存中取,没取到再查数据库,以取
{
$shoehistory = GetFileCache() ;
if(没缓存){
$shoehistory = 查数据库
AddFileCache($result)
}

//同理取别的参数

}


3,如果有数据更新,在 insert 完成后调 DelFileCache()
wobuhuicode
2016-09-12 17:48:48 +08:00
@keikeizhang 分分钟就太慢了~~查询都是按照毫秒算的
pyengwoei
2016-09-12 18:00:59 +08:00
@sherlocktheplant 这个学到了,以后可以试试
pyengwoei
2016-09-12 18:04:18 +08:00
@laobaozi 感谢了,这个是文件缓存对吧,就是建立一个实体文件,每次的最新数据就放文件里面?
还 有种是内存缓存对吧?
laobaozi
2016-09-12 18:24:58 +08:00
harker
2016-09-12 18:30:05 +08:00
没有什么大问题,记录一下 mysql 语句的执行时间记录,看看是哪条慢,再想办法优化
sfree2005
2016-09-12 22:12:20 +08:00
有实时性高的需求可以考虑用 firebase 或者 RethinkDB 。 可以完全代替也可以作为辅助, 看情况而定。
Septembers
2016-09-13 02:54:24 +08:00
https://github.com/igorw/EventSource
用 EventSource 主动推?
pangliang
2016-09-13 09:38:10 +08:00
如果你说的是不想挂那么多别的东西; 就 mysql 的话, 那你这个应该做一张 kv 结构 的表; 一种状态数据就只有一行; 加上你这个就是"其他系统更新状态" "这个系统读取" , 甚至可以考虑使用 mysql 内存表

你这个从业务逻辑上来讲, 既没有使用历史数据的需求, 也没有计算历史数据关系的需求; 所以, 你用"关系数据库", 还保存那么多历史数据, 本来就是多余的;

程序=数据结构+算法 ; 数据结构不对, 算法再怎么优化; 事倍功半
former
2016-09-13 09:58:29 +08:00
@mengxy 确是非问之答,只是看题主对数据的实时性要求很高顺口提下而已
zybdfdz
2016-09-13 10:45:32 +08:00
看都不用看,设计有问题
pyengwoei
2016-09-13 14:30:12 +08:00
@zybdfdz 请指教一下
pyengwoei
2016-09-13 14:32:00 +08:00
@pangliang 是的,谢谢提出,感觉确实问题多多
wizardforcel
2016-09-14 08:26:47 +08:00
首先要优化查询,比如用 join 连成一张表。四个子句很麻烦,但是要比你现在的五次查询效率高。

你写在五个函数或者写在一个里面效率都差不多。分到五个文件的话要 include ,可能会损失效率。

索引在 mysql 里是用 key 声明的东西, mysql 会自动为 where 后面的东西加索引,你可以开 workbench 看看。(如果不用 mysql 就当我没说)

缓存就是先部署好 redis 或 mc ,然后某个表读取的时候把数据存里面一份,之后从里面读,写的时候让它失效。(当然也可以细化到行)。
pyengwoei
2016-09-14 13:45:26 +08:00
@wizardforcel 感谢

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

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

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

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

© 2021 V2EX