MySQL花费太多时间来显示100万个数据


MySQL takes toomuch time to display 1 million data

我正在开发一个拥有数百万数据的应用程序,我需要在一个页面中列出所有数据。起初,我在单个查询中获取所有数据,并在client side中完成分页。但这几乎需要15分钟来加载整套。因此,我更改了每个请求获取10行的代码,并在server side上完成了分页。但性能仍然没有达到标准。那么所有的东西应该做什么才能快速获得数据或者处理大量数据的最佳方法是什么。

My query to fetch data:

:

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                                     |
+----+--------------------+-------+--------+-------------------+---------------+---------+-------------------------------+--------+------------------------------------------+
WHERE  ( w.work_order_status != 'Deleted' &&
         w.work_order_status != 'Closed')
ORDER BY  w.created_on DESC

如果只有一个work_order_status值,则将其更改为

WHERE w.work_order_status = 'Open'
ORDER BY w.created_on DESC

并添加

INDEX(work_order_status, created_on)

如果有多个其他值,this可能会工作(不太好):

INDEX(created_on)

为了获得更好的性能,您需要"记住您离开的地方"而不是使用OFFSET