3

我在优化 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)

4

2 回答 2

2

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

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
于 2012-10-15T19:10:46.480 回答
0

你应该可以做一个 between 语句,这样效率更高。

AND ou.created 在“2012-10-08 00:00:00”和“2012-10-08 23:59:59”之间

于 2012-10-15T19:11:39.600 回答