2012-10-15 126 views
2

我在优化MySQL查询时遇到了问题,但是到目前为止拉取500条记录的简单结果需要很长时间。MySQL JOIN与PHP foreach循环

我的查询是这样的:

SELECT ou.*, gr.accepted, gr.value 
FROM offer_usermeta ou 
LEFT JOIN gateway_requests AS gr ON ou.customer_id = gr.customer_id 
WHERE ou.customer_id != "" 
AND ou.created >= '2012-10-08 00:00:00' 
AND ou.created <= '2012-10-08 23:59:59' 
ORDER BY ou.created DESC LIMIT 500 

这个查询花费了整整一分钟的过度重复,也许40000条记录。我需要它根据客户ID拉入网关响应,如果有任何数据并且数据看起来正确,但我需要关于优化的提示。我正在考虑将数据单独提取并根据需要一起foreach,但我知道这可能会更慢......

任何提示? (如果有人知道那里有奇特的技巧,我使用codeigniter)

+1

请发表您的表结构。 –

回答

2

如果您还没有到目前为止,请在created列中添加一个索引。无论您的limit只有500条记录,数据库都必须获取所有记录来执行order by并匹配where条件。之后尝试

SELECT ou.*, gr.accepted, gr.value 
FROM offer_usermeta ou 
LEFT JOIN gateway_requests AS gr ON ou.customer_id = gr.customer_id 
WHERE ou.created between '2012-10-08 00:00:00' and '2012-10-08 23:59:59' 
ORDER BY ou.created DESC 
LIMIT 500 
+0

“not is null”发出错误,customer_id永远不为null。 *编辑*它的“不是空”,错误,如果是相反的方式。 –

+0

它可以在'left join'中为'null'。这就是为什么你使用'ou.customer_id!=“”'',对吧?并且我将where子句更改为“不为空” –

+0

“不为空”可能不是“正确的”。如果该列是“NOT NULL”,则该条件毫无意义。它取决于列是否可以是NULL,什么是空值。如果@ ark3typ3发布了表的结构,这将有所帮助。 –

0

你应该能够做一个更有效的语句。

和 '2012-10-08 00:00:00' 和 '23:59:59 2012-10-08' 之间ou.created

+0

感谢您的提示,它削减了一秒,但它更可读和友好,所以我喜欢它。 –