item
我在包含 400k 记录的 InnoDb 表中有一个查询(仅...)。我需要对表示层的结果进行分页(每页 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 的内存,2 核 CPU:
- mysqld 始终使用 > 65% 的 RAM,但仅增加 1-2% 运行以上查询
- mysqld 在运行上述查询时使用 14% 的 CPU,空闲时不使用
我的本地机器有 8Gb,8 核 CPU:
- mysqld 一直使用 28% 的 RAM,并且在运行上述查询时并没有真正增加(或者在很短的时间内我可以看到它)
- mysqld 在运行上述查询时使用 48% 的 CPU,空闲时不使用
我可以在哪里以及如何做才能在测试服务器上获得相同的性能?RAM 和/或 CPU 是否太低?
更新
我已经设置了一个具有相同规格但 8G 内存和 4 核 CPU 的新测试服务器,性能刚刚跃升至与我的机器相似的值。原来的服务器似乎没有使用所有的 RAM/CPU,为什么性能这么差?