AJAX请求需要很长时间才能完成请求

时间:2015-05-19 10:33:20

标签: php mysql ajax json codeigniter-2

我有一个MySQL查询,获得17000行。如果我使用Putty直接在MySQL终端执行该查询,则需要17~20秒来获取所有行。这可以。

但是当我尝试使用带有AJAX请求的PHP执行查询时,完成请求需要50~60秒,即使此查询已缓存。

我正在使用CodeIgniter PHP框架进行缓存及其AJAX请求。

我同意,与终端中的直接MySQL查询执行相比,HTTP请求和PHP执行可能需要一些时间。

MySQL直接查询执行:20秒 使用HTTP,php,Codeigniter和JSON格式,它被缓存:60秒。

我估计时差太长了。

我正在尝试执行的模型查询:

mysql> explain SELECT col1, col2, col3, col4, IFNULL(col5,'N/A') AS 'col55', `col6`, col7, col8, col9 FROM table1 LEFT JOIN table1 ON table1.fkid_colid=`voyage id` AND table1.alias_type='voyage_display' WHERE column10='voyage';
+----+-------------+--------------+------+-------------------------------------+---------+---------+------------------------------------+-------+-------------+
| id | select_type | table        | type | possible_keys                       | key     | key_len | ref                                | rows  | Extra       |
+----+-------------+--------------+------+-------------------------------------+---------+---------+------------------------------------+-------+-------------+
|  1 | SIMPLE      | table1       | ALL  | NULL                                | NULL    | NULL    | NULL                               | 37770 | Using where |
|  1 | SIMPLE      | table1       | ref  | PRIMARY,fk_table1_colid_idx         | PRIMARY | 4       | database.table1.column ID |     1 | Using index |
+----+-------------+--------------+------+-------------------------------------+---------+---------+------------------------------------+-------+-------------+
2 rows in set (0.00 sec)

对这个更长的装载时间有任何想法吗?如果你为此建议任何优化技术呢?

2 个答案:

答案 0 :(得分:1)

是。我刚刚通过分析控制器功能找到了问题。

因此,根据Codeigniter分析结果如下,

控制器执行时间:27.7074秒。

之后,我看了Chrome控制台完成请求的时间,从那时起我就知道了一个问题。

Stalled : 17.32 s
DNS Lookup: 1.000 ms
Initial connection  :262.000 ms
Request/Response        TIME
Request sent    0
Waiting (TTFB)  1.03 s
Content Download    29.84 s
Total time: 48.46 s

从报告中,大问题是“停滞”时间。花了17.32秒。这是因为我的副代理问题,而且无法避免,也不会发生在我的客户方面。所以它可以忽略不计。

所以,

直接查询执行17~20秒

Ajax请求在浏览器端下载内容:29~30秒。

因此3MB内容下载的差异是10秒,我的客户被接受了:)

感谢您的回复。

答案 1 :(得分:0)

您的查询

SELECT 
col1, 
col2, 
col3, 
col4, 
IFNULL(col5,'N/A') AS 'col55', 
`col6`, 
col7, 
col8, 
col9 
FROM table1 
LEFT JOIN table1 ON table1.fkid_colid=`voyage id` AND table1.alias_type='voyage_display' 
WHERE column10='voyage';

从解释计划中可以清楚地看出where的使用不是使用索引而是尝试扫描整个表。

您需要将索引添加为

alter table table1 add index column10_idx(column10);

上面的列在where clause中使用,join子句看起来很好并且正在解析索引。

确保在应用索引之前备份数据库。应用索引后检查查询速度。