我有一个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)
对这个更长的装载时间有任何想法吗?如果你为此建议任何优化技术呢?
答案 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子句看起来很好并且正在解析索引。
确保在应用索引之前备份数据库。应用索引后检查查询速度。