我在优化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,如果有人知道那里的花哨技巧)
答案 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'