MySql缓慢的数据获取

时间:2012-10-22 09:08:34

标签: php mysql amazon-ec2 high-load

我有一大堆行的MySql表。我正在做简单的请求,它的工作速度非常快。当请求本身仅需0.3秒时,将数据提取到客户端的唯一一个问题是非常慢,大约150秒。

我在客户端和Amazon EC2 MySql实例上使用php 5.3 + ZendFramework。 PHP代码和MySql位于不同的服务器上。

有谁能告诉我如何提高数据获取速度?

3 个答案:

答案 0 :(得分:2)

根据评论,您最终提供了正在运行的查询。

select * from table

你还说你有“巨大的行数”。这应该足够简单,您可以理解为什么需要永久地转移到查询数据库的框中。

而且,仅仅因为您的查询运行速度很快,您仍然需要处理网络限制。另外,一旦您实际收到结果,假设您是否正在使用ORM,您会发现结果集的水合作用会增加您的请求的复杂性和时间。

总的来说,你自己回答了这个问题。不要在表格“巨大”的情况下进行select * from table

您应该查看为查询添加limits和偏移量,并仅选择实际需要的行。

此外,“巨大”是非常主观的。对我来说,一张大桌子大约有1000万行。但对于其他人来说,1000万还很小。我甚至不想在一张巨大的桌子上放一个数字。

答案 1 :(得分:0)

缓慢是因为您从表中检索了所有数据,并且由于您的数据库和网站有两个不同的服务器,因此需要通过网络传输的所有数据都将导致额外的缓慢。

如果你在客户端运行时问为什么它更快,那是因为大多数sql客户端会自动增加对行数的限制。

答案 2 :(得分:0)

正如所有评论所说:您必须提供更多信息才能获得准确(或至少不那么模糊)的答案。但是,您应该记住您编写的每个查询的一些经验法则:

  • 尽可能避免使用SELECT *,尤其是SELECT COUNT(*)之类的内容,只选择您感兴趣的字段。
  • 通过巧妙索引的表格拆分数据并使用JOIN。一个好的JOIN可以提高性能,通常非常显着。
  • 使用EXPLAIN EXTENDED,避免MySQL必须在磁盘上创建临时表的情况
  • 使用EXPLAIN时,还要检查隐式CASTCOLLATION次转化。与PHP不同,UNSIGNED INTEGERVARCHAR不同。可以把它想象为$x = 123;后跟if ($x === '123'),这将是假的:一个字符串!==一个int ...
  • 避免使用大型数据字段(例如MEDIUMTEXT),因为它们始终会导致磁盘访问
  • 尽可能避免使用LIKE,尤其是当您使用通配符时x LIKE 'y%z'
  • 请记住:%不是唯一的外卡:_是一种 joker ,适用于单个字符
  • 你有一个索引,但是你可以使用更多索引,而不会变得愚蠢吗?不要索引太少,也不要索引太多
  • 您是否选择了正确的存储引擎
  • EXPLAINEXPLAINEXPLAIN再次......
  • 如果 使用慢速查询,缓存结果
  • LIMIT - “huge”数据集的结果是必须的。如果您正在获取大量数据块,那么您正在使用它们做什么?我不可能设想所有数据将作为一个大块发送到客户端的情况,是吗?