2013-05-01 73 views
3

我在InnoDb item表中查询了一个包含400k条记录(仅...)的表。我需要将表示层的结果分页(每页60个),因此我使用LIMIT,其值取决于要显示的页面。MySQL LIMIT x,y在2台机器上的性能巨大差异

的查询(在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-50s。

EXPLAIN都是相同的:

当查询 show variables
+----+-------------+-------+-------+---------------+-----------+---------+------+--------+-------------+ 
| 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 | 
+----+-------------+-------+-------+---------------+-----------+---------+------+--------+-------------+ 

的唯一配置的区别:

  • innodb_use_native_aio。它在测试服务器上启用,而不是在我的机器上启用。我试图禁用它,我看不出有任何显著变化
  • innodb_buffer_pool_size 1G的测试服务器上,2G在我的机器上

测试服务器RAM的2GB,2个核心CPU:

  • 的mysqld使用的RAM> 65%在所有时间,但只增加1-2%上面的查询运行
  • mysqld使用CPU的14%,而在运行上述查询,没有空闲时

我的本地机器拥有8GB,8核CPU:

  • mysqld使用的RAM 28%,在所有的时间,并在运行上面的查询并没有真正增加(或对于这么短的时间,我可以看到它)
  • mysqld使用CPU的48%,而运行上面的查询,没有空闲时

在哪里,我能做些什么来有在测试服务器上相同的性能?内存和/或CPU是否太低?

UPDATE

我已经安装使用相同的规格,但RAM和4核CPU,性能8G一个新的测试服务器刚刚跃升至类似于我的机器值。原来的服务器似乎没有使用所有的RAM/CPU,为什么性能更差?

+1

我觉得比尔很好回答,但除此之外,我认为你会更好地防止“图片”列为“NULL”或“'”(空)。在输入期间,如果它是空的,你应该把它设置为NULL,从而避免必须执行上面的AND。 – pickypg 2013-05-01 05:06:05

+0

@pickypg谢谢,这是一个好主意,我也应该这么想。我们可以在我们的代码中轻松做到这一点 – JScoobyCed 2013-05-01 10:07:37

回答

2

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

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

另一个提示:你真的不想使用LIMIT 110000, 60。这会导致MySQL从缓冲池中读取110000行(如有必要,可能会从磁盘加载它们)以放弃它们。还有其他方法可以更有效地浏览结果集。

查看如Optimized Pagination using MySQL的文章。

+0

谢谢。我将更详细地查看链接,但首先看起来这是针对静态SQL的。我上面的SQL是这么多的(SQL是一个搜索表单,它有很多选项,一些是值的范围)......一开始看:) – JScoobyCed 2013-05-01 10:11:22