MySQL JOIN vs PHP foreach循环

时间:2012-10-15 19:08:24

标签: php mysql codeigniter

我在优化MySQL查询时遇到问题,但到目前为止,将简单结果限制为500条记录需要很长时间。

我的疑问是:

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

这个查询花了整整一分钟来迭代大约40,000条记录。我需要它来根据客户ID提取网关响应(如果有的话),并且此查询的数据看起来是正确的,但我需要有关优化的提示。我正在考虑单独提取数据并在必要时将它们联合起来,但我知道这可能会慢得多......

任何提示? (我正在使用codeigniter,如果有人知道那里的花哨技巧)

2 个答案:

答案 0 :(得分:2)

如果您还没有,请在created列添加索引。无论您是否只有order by只有500条记录,数据库都必须获取所有记录以执行where并匹配limit条件。之后尝试

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

答案 1 :(得分:0)

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

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

相关问题