2

我最近切换了服务器,因为 Joyent 即将结束他们的服务。但是关于 rimuhosting 的查询似乎需要更长的时间(2-6 次)。但是行为上存在巨大差异:大多数查询运行时间为 0.02 秒或更短,而有时这些完全相同的查询需要 0.5 秒或更长时间。两台服务器都在运行 mySQL 和 PHP(版本相似但确切数字不一样)。

服务器负载为 CPU 的 20-40% 空闲。大部分内存都在使用,但他们告诉我这是正常的。技术支持告诉我它没有交换:这是它现在的样子:(尽管内存使用量最终会增加到接近最大值,就像上次一样)内存:总共 1513548k,已使用 1229316k,免费 284232k,63540k 缓冲区交换:总共 131064k, 0k 使用,131064k 免费,981420k 缓存

SQL 最大连接数设置为 400。

那么,为什么有时我会收到这些超级慢的查询呢?下面是一个查询示例,有时为 0.01 秒,有时大于 1 秒:SELECT (!attacked AND (firstLoginDate > 1348703469)) as protected, id, universe.uid, universe.name AS obj_name, top,left, guilds.name 作为联盟, rotate,what, player_data.first, player_data.last, 援助 AS gid, (aid=1892 ANDaid>0) as am, 舰队 LIKE '%Turret%' AS 炮塔, startLeft, startTop, endLeft , endTop, 持续时间, startTime, movetype, 移动,速度, 防御, hp, lastAttack>1349740269 AS ra 从宇宙 LEFT JOIN player_data ON Universe.uid=player_data.uid LEFT JOIN guilds ONaid=guilds.gid WHERE (扇区='21_82 ' OR 扇区='22_82' OR 扇区='21_83' OR 扇区='22_83' ) OR ( Universe.uid=1568425485 AND ( upgrade=1 OR building=1 ))

是的,我确实在所有适当的列上都有索引。以上三个表都是 InnoDB 表,这意味着它们只是行锁定的,而不是表锁定的。

但这很有趣:(新服务器) Innodb_row_lock_time_avg 400 获取行锁的平均时间,以毫秒为单位。Innodb_row_lock_time_max 4,010 获取行锁的最长时间,以毫秒为单位。Innodb_row_lock_waits 31 必须等待行锁的次数。

为什么获得行锁需要这么长时间?我的旧服务器能够更快地获得行锁: Innodb_row_lock_time_avg 26 获得行锁的平均时间,以毫秒为单位。

这是新服务器: Opened_tables 5,500(仅 2 小时)已打开的表数。如果打开的表很大,那么您的表缓存值可能太小了。表缓存 256 个表锁等待 3,302 个(仅 2 小时)

这是旧服务器: Opened_tables 420
表缓存 64

这有意义吗?如果我增加表缓存会减轻事情吗?

注意:我在这台服务器上有 1.5 GB

这里是解释 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE Universe index_merge uidwhat,uid,uidtopleft,upgrading,building,sector sector,uid 38,8 NULL 116 Using sort_union(sector,uid); 使用 where 1 SIMPLE player_data ref mainIndex mainIndex 8 jill_sp.universe.uid 1
1 SIMPLE guilds eq_ref PRIMARY PRIMARY 8 jill_sp.player_data.aid 1

4

0 回答 0