MySQL连接与PHP foreach循环

MySQL连接与PHP foreach循环,php,mysql,codeigniter,indexing,Php,Mysql,Codeigniter,Indexing,我在优化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

我在优化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
选择ou.*,gr.accepted,gr.value
从报价单
左加入网关请求作为ou上的gr.customer\u id=gr.customer\u id
哪里有ou.customer_id!="" 
和ou.created>=“2012-10-08 00:00:00”

和ou.created在
created
列中添加一个索引(如果到目前为止还没有)。DB必须获取所有记录,以便按
进行排序,并匹配
where
条件,无论您的
限制仅为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.created between '2012-10-08 00:00:00' and '2012-10-08 23:59:59' 
ORDER BY ou.created DESC 
LIMIT 500

你应该能够做一个between语句,这样更有效


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

请发布您的表格结构。感谢您的提示,它缩短了一秒钟,但更具可读性和友好性,因此我喜欢它。“not is null”给出了一个错误,customer_id从不为null。编辑它的“不为空”,如果它是另一种方式,则会出错。它可以是
左连接中的
null
。这就是为什么您使用
ou.customer\u id!=“
,对吗?我将where子句改为
不为空
不为空
可能不“正确”。如果列为
非空
,则该条件没有意义。这取决于列是否可以为
NULL
,以及空值使用的内容。如果@ark3typ3公布了表格的结构,这会有所帮助。@G-Nugget:你说得对
ou.customer_id
不在联接的表中,而是在第一个表中。在这种情况下,它不能为null。这是可行的,但经过一些基准测试后,我确实用foreach获得了更快的结果(3秒vs 54秒)。我不确定这是怎么回事,但由于这是一个只有管理员和执行官才会看到的低流量功能,我并不太担心对服务器性能的显著影响……不过我会继续研究优化我的查询,因为我觉得对我实现的结构进行一些修改可能会带来更快的性能