【发布时间】:2015-07-28 12:41:42
【问题描述】:
我正在开发一个包含数百万数据的应用程序,我需要在一个页面中列出所有数据。起初,我在单个查询中获取所有数据,并且分页在 client side 中完成。但这需要将近 15 分钟才能加载完整的集合。所以我更改了每个请求获取 10 行的代码,并在server side 上完成了分页。但性能仍然达不到标准。那么所有事情应该怎么做才能快速获取数据或处理海量数据的最佳方式。
我的查询以获取数据:
更新:
SELECT w.work_order_id,
(SELECT CONCAT(user_fname, ' ', user_lname) FROM users WHERE user_id = w.created_by) AS created_by,
CASE w.assignee WHEN 0 THEN 'All' WHEN -1 THEN 'Unassigned' ELSE CONCAT(u.user_fname, ' ', u.user_lname) END AS assignee
FROM FiveVan_work_orders w
LEFT JOIN users u ON (u.user_id = w.assignee)
WHERE ( w.work_order_status != 'Deleted' && w.work_order_status != 'Closed') ORDER BY w.created_on DESC LIMIT 0,10;
我已经为页面创建了索引,这是解释查询的结果
+----+--------------------+-------+--------+-------------------+---------------+---------+-------------------------------+--------+------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+--------+-------------------+---------------+---------+-------------------------------+--------+------------------------------------------+
| 1 | PRIMARY | w | index | work_order_status | work_order_id | 790 | NULL | 340319 | Using where; Using index; Using filesort |
| 1 | PRIMARY | u | eq_ref | PRIMARY | PRIMARY | 4 | fivevan_loadtest.w.assignee | 1 | NULL |
| 2 | DEPENDENT SUBQUERY | users | eq_ref | PRIMARY | PRIMARY | 4 | fivevan_loadtest.w.created_by | 1 | NULL |
+----+--------------------+-------+--------+-------------------+---------------+---------+-------------------------------+--------+------------------------------------------+
【问题讨论】:
-
您可以将数据拆分为带有连接ID的单独表,因此要查询的数据要少得多..并且每条记录的其他部分在第一批之后被拉入。
-
我没有看到和 LIMIT x,y... 所以您的查询仍在获取所有数据,而不是仅获取部分数据,并且对大数据的子选择总是很慢
-
@Max 对不起,我的错。这是之前使用的查询。
-
你可以发布你当前的查询吗?
-
@Max 我增加了限制