1
ytmsdy 2016-09-12 15:39:24 +08:00
不要用 select *,最好要的字段都给带上。万一你的表里面有一个特别大的字段,然后你又用不到,这时间开销那就酸爽了。
|
2
imnpc 2016-09-12 15:51:47 +08:00
1.给数据表查询较多的字段加上索引
2.只查询必须的字段 |
6
shakyamuni 2016-09-12 16:00:54 +08:00
加索引,使用长轮寻。
|
7
keikeizhang 2016-09-12 16:02:58 +08:00
这个事情有 laravel 框架分分钟解决
|
8
former 2016-09-12 16:04:19 +08:00
可以试试 websocket
|
9
ten789 2016-09-12 16:04:31 +08:00
1 个比 5 个好 cache 最好
|
10
pyengwoei OP @keikeizhang 现在是小项目,前端 HTML 才 100 多行代码,后台 PHP 文件也才 80 多行。。
|
12
imlewc 2016-09-12 16:13:56 +08:00
@keikeizhang 这个跟框架什么关系 这么推荐 laravel 是不是有点牵强了 缓存可以试下
|
14
pangliang 2016-09-12 16:42:19 +08:00
你这些在意义上都是缓存数据, 所以你放 mysql 再查出最后一行来, 当然别扭; 上 memcache 或者 redis
|
16
dream7758521 2016-09-12 16:47:22 +08:00 via Android
@ytmsdy 这里就你的靠谱,其他人一上来,就推荐屠龙秘籍
|
17
pyengwoei OP @dream7758521 也不是 大家看到的问题不同,@ytmsdy 的最简单直接而已 呵呵, select * 这里确实有问题
|
18
laobaozi 2016-09-12 17:15:18 +08:00
每次都从 5 张表里取最新的第一条,不知道这 5 个第一条是不是有什么联系
第一是考虑,如果能将这 5 条合并到一张表或者能找到合适的字段做外联,那么一次 sql 的执行全部查出来将提高不少效率 第二就是缓存 sql 结果,更新数据时清除再缓存 |
19
pyengwoei OP @laobaozi 好的,我仔细想想,看来 SQL 这里 有很大的提高空间。
“”第二就是缓存 sql 结果,更新数据时清除再缓存“” 这个的意思是,不用每次都插入新的一条数据,表里面只留最新的数据的意思吗? 我现在好像确实表里面有几万数据了 |
20
akira 2016-09-12 17:20:36 +08:00
id 肯定是自增索引吧,先取 max id ,再取对应行的数据会快很多
|
21
sherlocktheplant 2016-09-12 17:27:58 +08:00
加一层内存缓存就好了 反正只需要最新数据 插入数据的时候再更新内存缓存
或者直接磁盘缓存也可以 直接把需要的结果写到磁盘里的一个或者五个文件里 如果是一个文件就需要自己定格式 简单的格式就是换行符分割数据 跟内存数据一样 其他地方插入数据的时候 除了入库还需要更新缓存文件 |
23
laobaozi 2016-09-12 17:43:55 +08:00
缓存结果是指 将 select 得到的结果用文件或者内存缓存,以文件缓存为例:
1.创建一个文件缓存的方法, 定义 AddFileCache() GetFileCache() DelFileCache() 三个方法,以表名为参数; 2.在接到请求时,首先调用尝试从缓存中取,没取到再查数据库,以取 { $shoehistory = GetFileCache() ; if(没缓存){ $shoehistory = 查数据库 AddFileCache($result) } //同理取别的参数 } 3,如果有数据更新,在 insert 完成后调 DelFileCache() |
24
wobuhuicode 2016-09-12 17:48:48 +08:00
@keikeizhang 分分钟就太慢了~~查询都是按照毫秒算的
|
25
pyengwoei OP @sherlocktheplant 这个学到了,以后可以试试
|
26
pyengwoei OP @laobaozi 感谢了,这个是文件缓存对吧,就是建立一个实体文件,每次的最新数据就放文件里面?
还 有种是内存缓存对吧? |
28
harker 2016-09-12 18:30:05 +08:00
没有什么大问题,记录一下 mysql 语句的执行时间记录,看看是哪条慢,再想办法优化
|
29
sfree2005 2016-09-12 22:12:20 +08:00 via iPhone
有实时性高的需求可以考虑用 firebase 或者 RethinkDB 。 可以完全代替也可以作为辅助, 看情况而定。
|
30
Septembers 2016-09-13 02:54:24 +08:00 via iPad
https://github.com/igorw/EventSource
用 EventSource 主动推? |
31
pangliang 2016-09-13 09:38:10 +08:00
如果你说的是不想挂那么多别的东西; 就 mysql 的话, 那你这个应该做一张 kv 结构 的表; 一种状态数据就只有一行; 加上你这个就是"其他系统更新状态" "这个系统读取" , 甚至可以考虑使用 mysql 内存表
你这个从业务逻辑上来讲, 既没有使用历史数据的需求, 也没有计算历史数据关系的需求; 所以, 你用"关系数据库", 还保存那么多历史数据, 本来就是多余的; 程序=数据结构+算法 ; 数据结构不对, 算法再怎么优化; 事倍功半 |
33
zybdfdz 2016-09-13 10:45:32 +08:00
看都不用看,设计有问题
|
36
wizardforcel 2016-09-14 08:26:47 +08:00 1
首先要优化查询,比如用 join 连成一张表。四个子句很麻烦,但是要比你现在的五次查询效率高。
你写在五个函数或者写在一个里面效率都差不多。分到五个文件的话要 include ,可能会损失效率。 索引在 mysql 里是用 key 声明的东西, mysql 会自动为 where 后面的东西加索引,你可以开 workbench 看看。(如果不用 mysql 就当我没说) 缓存就是先部署好 redis 或 mc ,然后某个表读取的时候把数据存里面一份,之后从里面读,写的时候让它失效。(当然也可以细化到行)。 |
37
pyengwoei OP @wizardforcel 感谢
|