【问题标题】:MySQL takes toomuch time to display 1 million dataMySQL 显示 100 万条数据需要太多时间
【发布时间】: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 我增加了限制

标签: php mysql innodb


【解决方案1】:
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)

如果有多个其他值,这可能会起作用(不太好):

INDEX(created_on)

要获得更好的性能,您需要“记住上次中断的位置”,而不是使用OFFSET。我在my pagination blog 中讨论这个问题。

【讨论】:

    猜你喜欢
    • 2022-10-21
    • 1970-01-01
    • 2023-03-11
    • 2011-09-23
    • 2014-01-03
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多