我有一大堆行的MySql表。我正在做简单的请求,它的工作速度非常快。当请求本身仅需0.3秒时,将数据提取到客户端的唯一一个问题是非常慢,大约150秒。
我在客户端和Amazon EC2 MySql实例上使用php 5.3 + ZendFramework。 PHP代码和MySql位于不同的服务器上。
有谁能告诉我如何提高数据获取速度?
答案 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
时,还要检查隐式CAST
或COLLATION
次转化。与PHP不同,UNSIGNED INTEGER
与VARCHAR
不同。可以把它想象为$x = 123;
后跟if ($x === '123')
,这将是假的:一个字符串!==一个int ... MEDIUMTEXT
),因为它们始终会导致磁盘访问LIKE
,尤其是当您使用通配符时x LIKE 'y%z'
)%
不是唯一的外卡:_
是一种 joker ,适用于单个字符EXPLAIN
,EXPLAIN
和EXPLAIN
再次...... LIMIT
- “huge”数据集的结果是必须的。如果您正在获取大量数据块,那么您正在使用它们做什么?我不可能设想所有数据将作为一个大块发送到客户端的情况,是吗?