我运行的过程很简单,它会定期提取RSS feed并更新MySQL数据库中的文章。
现在,articles表已填充到约13万行。对于找到的每篇文章,处理器都会检查该文章是否已经存在。这些查询几乎总是花费300毫秒,大约每10或20次尝试,它们就会花费2秒钟以上。
SELECT id FROM `articles` WHERE (guid = 'http://example.com/feed.rss') LIMIT 1;
# Query_time: 2.754567 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
Run Code Online (Sandbox Code Playgroud)
我在guid列上有一个索引,但是每当遇到新文章时,它就会被添加到Articles表中-使查询缓存无效(对吗?)。
慢查询日志中的其他一些字段报告检查了120多个行。
当然,在我的开发机器上,这些查询大约需要0.2毫秒。
该服务器是Engine Yard Solo(EC2)的虚拟主机,具有1.7GB的内存以及这些天附带的任何CPU EC2。
任何建议将不胜感激。
更新资料
事实证明,问题出在椅子和键盘之间。
我在'id'上有一个索引,但在'guid'上查询。
在“ guid”上添加索引可使查询时间降低到0.2毫秒。
感谢大家提供的所有有用提示!
跑:
EXPLAIN SELECT id FROM `articles` WHERE (guid = 'http://example.com/feed.rss') LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
注意EXPLAIN前面的。这将告诉您MySQL在做什么。很难相信,从索引中探查一行可能要花费2.7秒,除非您的计算机严重过载和/或抖动。考虑到行计数为0,我猜想MySQL进行了全表扫描却什么也没找到,这可能意味着您没有您认为已做的索引。
为了回答您的另一个问题,每当对表进行任何更改时articles,涉及该表的所有查询缓存条目都将失效。