Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单的MySQL查询需要2到3秒?_Mysql_Performance - Fatal编程技术网

简单的MySQL查询需要2到3秒?

简单的MySQL查询需要2到3秒?,mysql,performance,Mysql,Performance,我有一个相当简单的运行过程,定期提取RSS提要并更新MySQL数据库中的文章 articles表现在已填充到大约130k行。对于找到的每个项目,处理者都会检查项目是否已经存在。这些查询几乎总是需要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

我有一个相当简单的运行过程,定期提取RSS提要并更新MySQL数据库中的文章

articles表现在已填充到大约130k行。对于找到的每个项目,处理者都会检查项目是否已经存在。这些查询几乎总是需要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
我在guid列上有一个索引,但是每当遇到一个新项目时,它就会被添加到articles表中,从而使查询缓存无效(对吗?)

慢速查询日志报告中的一些其他字段检查了120多行

当然,在我的开发机器上,这些查询大约需要0.2毫秒

服务器是Engine Yard Solo(EC2)的虚拟主机,拥有1.7GB内存和EC2目前附带的任何CPU

如有任何建议,将不胜感激

更新

原来问题出在椅子和键盘之间

我在“id”上有一个索引,但在“guid”上查询

在“guid”上添加索引将查询时间缩短到0.2毫秒

谢谢大家提供的有用提示

运行:

EXPLAIN SELECT id FROM `articles` WHERE (guid = 'http://example.com/feed.rss')  LIMIT 1;
注意前面的
解释
。这将告诉您MySQL正在做什么。很难相信从索引中探测一行可能需要2.7秒,除非您的机器严重超载和/或颠簸。考虑到行数为0,我猜MySQL做了一次完整的表扫描,什么也没有找到,这可能意味着你没有你认为你有的索引


为了回答您的另一个问题,每当您对
articles
表进行任何更改时,涉及该表的所有查询缓存项都将无效。

日志显示未读取或甚至未检查任何行,因此问题不在于您的查询,而在于您的服务器。EC2的致命弱点是IO/s,也许MySQL不得不从磁盘加载索引,但服务器的磁盘已经完全饱和

如果索引足够小,可以放入内存(确保my.cnf为
key\u buffer
(MyISAM)或
innodb\u buffer\u pool\u size
(innodb))分配足够的内存,您应该能够使用

SELECT guid FROM articles
查看说明,确保说明上写着“使用索引”。如果没有,这个应该:

SELECT guid FROM articles FORCE INDEX (guid) WHERE LENGTH(guid) > 0
或者,如果
guid
不是主键或唯一键,则可以删除其索引并创建另一个索引列,用于以索引大小的一小部分快速检索记录。列
guid\u crc32
将是一个无符号整数,并将保存
guid

ALTER TABLE articles ADD COLUMN guid_crc32 INT UNSIGNED, ADD INDEX guid_crc32 (guid_crc32);
UPDATE articles SET guid_crc32 = CRC32(guid);
然后,您的SELECT查询将如下所示:

SELECT id FROM articles WHERE guid = 'http://example.com/feed.rss' AND guid_crc32 = CRC32('http://example.com/feed.rss') LIMIT 1;

优化器应该使用
guid\u crc32
上的索引,该索引应该比通过
guid

进行搜索更快、更小。如果此表得到大量更新,则mysql可能无法正确更新索引计数。尝试“检查表格文章”来更新索引计数,看看您的表格是否正常

还要尝试查看在您的查询上执行EXPLAIN是否会在您的dev和prod机器上给出相同的结果。如果结果不同,请尝试优化表格


这些是myisam表还是innodb表?

假设GUID已编制索引,ID是主键,则出现“错误”。在这种情况下,这是一个仅索引的查询。索引正在从内存中转储,磁盘可能正忙

根据您的更新/插入/删除模式,您的数据库可能需要“优化”命令

SQL命令我希望看到以下命令的输出:

show table status like 'articles';
explain SELECT id FROM `articles` WHERE (guid = 'http://example.com/feed.rss')  LIMIT 1;
explain articles;
我希望看到的系统命令的输出(假设为Linux):

告诉我们你有多少内存,因为1.7mb是错误的,或者一些真正令人兴奋的事情正在发生


编辑您的SQL server在my.cnf中有多少可用内存?

1.7MB的内存非常小。我的286电脑有1Mb的tho。是的,请编辑并修正这个数字,因为我看起来“不可能”修复了内存注释-它应该是GB。谢谢我刚刚注意到Luke说,同一个查询反复执行,最终每隔几十次就会变慢,这削弱了我关于从磁盘加载索引的理论。除非服务器为索引保留的内存太少,以至于每隔几十次尝试就交换一次。
iostat 5 5