MySQL LIMIT x,y性能在2台机器上有巨大差异

时间:2013-05-01 02:57:08

标签: mysql performance

我在InnoDb item表中有一个查询,其中包含400k记录(仅...)。我需要为表示层分页结果(每页60个),所以我使用LIMIT值,具体取决于要显示的页面。

查询是(110000偏移只是一个例子):

SELECT i.id, sale_type, property_type, title, property_name, latitude,
       longitude,street_number, street_name, post_code,picture, url,
       score, dw_id, post_date
FROM item i WHERE picture IS NOT NULL AND picture != ''
AND sale_type = 0
ORDER BY score DESC  LIMIT 110000, 60;

在我的机器上运行此查询大约需要1秒。 在我们的测试服务器上运行此查询是45-50秒。

EXPLAIN都是一样的:

+----+-------------+-------+-------+---------------+-----------+---------+------+--------+-------------+
| id | select_type | table | type  | possible_keys | key       | key_len | ref  | rows   | Extra       |
+----+-------------+-------+-------+---------------+-----------+---------+------+--------+-------------+
|  1 | SIMPLE      | i     | index | NULL          | IDX_SCORE | 5       | NULL | 110060 | Using where |
+----+-------------+-------+-------+---------------+-----------+---------+------+--------+-------------+

查询show variables的唯一配置差异是:

  • innodb_use_native_aio。它在测试服务器上启用,而不是在我的机器上启用。我试过禁用它,我没有看到任何重大变化
  • innodb_buffer_pool_size 1G在测试服务器上,2G在我的机器上

测试服务器有2Gb ram,2核CPU:

  • mysqld使用>在任何时候都有65%的RAM,但只能增加1-2%以上的查询
  • mysqld在运行上述查询时使用14%的CPU,空闲时不使用

我的本​​地机器有8Gb,8核CPU:

  • mysqld一直使用28%的RAM,并且在运行上述查询时没有真正增加(或者我可以看到这么短的时间)
  • mysqld在运行上述查询时使用48%的CPU,空闲时不使用

在测试服务器上,我可以在哪里以及如何才能获得相同的性能? RAM和/或CPU是否太低?

更新

我已经设置了一个新的测试服务器,它具有相同的规格,但是8G的RAM和4个核心CPU,性能刚刚跳到类似于我的机器的值。原始服务器似乎没有使用所有的RAM / CPU,为什么性能更差?

1 个答案:

答案 0 :(得分:2)

杀死性能的最可靠方法之一是让MySQL扫描一个不适合内存的索引。因此在查询期间,它必须将部分索引加载到缓冲池中,然后逐出该部分并加载索引的其他部分。在查询期间导致缓冲池中的流失会导致大量I / O负载,这使得它非常慢。磁盘I / O比RAM慢大约100,000倍。

因此,如果您的索引是1.5GB,那么1GB缓冲池和2GB缓冲池之间会有很大差异。

另一个提示:你真的不想使用LIMIT 110000, 60。这导致MySQL从缓冲池读取110000行(如果需要可能从磁盘加载它们)只是为了丢弃它们。还有其他方法可以更有效地分页结果集。

请参阅Optimized Pagination using MySQL等文章。