我正在尝试从多个表中提取数据,当我使用 ORDER BY 日期时间字段时,它会在至少 10 秒后返回结果,但如果我在没有 ORDER BY 的情况下执行相同的查询,那么它会在 2 秒内返回结果。
这是我当前的查询
SELECT
ph.call_subject AS callSubject,
ac.account_name AS accountName,
DATE_FORMAT(ph.trigger_on, "%c/%e/%Y %h:%i %p") AS triggerOn,
ind.name AS industry,
cc.call_code_name AS callCode
FROM phone_calls AS ph
INNER JOIN accounts AS ac ON ph.account_id = ac.account_id
INNER JOIN industries AS ind ON ind.industry_id = ac.industry_id
INNER JOIN call_codes AS cc ON ph.call_code_id = cc.call_code_id
WHERE ac.status = 1 AND ph.status = 1 AND ph.owner_id = 1 AND ac.do_not_call = 0
AND ph.trigger_on BETWEEN '2012-11-19 00:00:00' AND '2013-03-19 23:59:59'
ORDER BY ph.trigger_on ASC LIMIT 0,1000
以下字段均为 INT(11) UNSIGNED 类型
ph.account_id
ac.account_id
ind.industry_id
ac.industry_id
ph.call_code_id
cc.call_code_id
ph.owner_id
以下字段均为tinyint(1)类型
ac.status
ph.status
ac.do_not_call
该字段是日期时间类型
ph.trigger_on
请注意,accounts 有 300K 条记录,phone_calls 有 500 万条记录。
我该怎么做才能更快地执行此 ORDER BY?请注意,我的所有 where 子句字段、所有 ON 子句和 ph.trigger_on 都已建立索引。我使用的是 InnoDB 存储引擎而不是 MyIsam。
Thanks
请尝试这个:
在列上建立索引(phone_calls.trigger_on, phone_calls.status, phone_calls.owner_id)
叫它pcto
将 FROM 子句更改为:
FROM phone_calls AS ph FORCE INDEX (pcto)
这是理想的情况。如果它不起作用,请添加评论,我将为您提供另一种保证有效的方法,并为您提供所需的性能改进。
请注意:在查询中的“每个”列上构建索引并不重要(实际上也没有什么好处)。 MySQL 每个表只能使用一个索引(或更准确地说每个表别名)。您需要构建我们告诉您的索引。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)