我在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,为什么性能更差?
我觉得比尔很好回答,但除此之外,我认为你会更好地防止“图片”列为“NULL”或“'”(空)。在输入期间,如果它是空的,你应该把它设置为NULL,从而避免必须执行上面的AND。 – pickypg 2013-05-01 05:06:05
@pickypg谢谢,这是一个好主意,我也应该这么想。我们可以在我们的代码中轻松做到这一点 – JScoobyCed 2013-05-01 10:07:37