【发布时间】:2013-04-25 02:16:55
【问题描述】:
我在 InnoDb item 表中有一个查询,其中包含 40 万条记录(仅...)。我需要对表示层的结果进行分页(每页 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 的 RAM 和 4 核 CPU,性能刚刚跃升至与我的机器相似的值。原来的服务器似乎没有使用所有的 RAM/CPU,为什么性能这么差?
【问题讨论】:
-
我认为比尔回答得很好,但除此之外,我认为您最好阻止
picture列成为NULL或''(空) .在输入时,如果它为空,您应该将其设置为NULL,从而避免必须执行上面的AND。 -
@pickypg 谢谢这是一个好主意,我也应该想到。我们可以在代码中轻松做到这一点。
标签: mysql performance