4

我有一个从许多表中提取的查询,但速度很慢,我想改进它。

SELECT 
    ph.phone_call_id AS id,
    ph.call_subject AS callSubject,
    ac.account_name AS accountName,
    ph.trigger_on AS triggerOn,
    ph.isAppointment,
    ph.status,
    ind.name AS industry,
    cc.call_code_name AS callCode,
    ac.account_id 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-10-09 00:00:00' AND '2013-04-09 23:59:59' 
LIMIT 0,25 

请注意,phone_Calls 表有大约 450 万条记录,帐户大约有 30 万条记录。

我现在有这样的索引

ph.trigger_on
ph.owner_id
ph.status


ac.status
ac.do_not_call
ac.account_id

这是我解释查询时得到的

在此处输入图像描述

4

2 回答 2

1

重要的是要记住,创建质量索引的列是具有高度唯一性的列。我不确定status您的系统中有多少值,但如果您的表只有 3 种可能的状态,这不是一个好的索引。

让您的索引位于您正在执行的连接操作的核心列上也会很有帮助。在这种情况下ph.account_id, ac.account_id, ind.industry_id, ac.industry_id, ph.call_code_id,ph.owner_idcc.call_code_id所有看起来都像是好的索引候选(如果它们还不是索引)。请注意,如果您的任何表有很多索引(超过 5 个),这可能会减慢您的查询速度。此外,如果您所涉及的任何表有大量的写入或删除(与读取次数相当),那么对这些表进行大量索引是不明智的,因为每个索引文件在有很多表的表上被更频繁地重写对它们执行的写操作。根据我的经验,索引是一种艺术形式,而不是科学,因此您必须进行一些实验才能找到最适合您的系统的方法。如果可能,请离线进行实验,看看在给定数据集的情况下什么能提供最佳提升。祝你好运。

于 2013-04-09T22:41:54.057 回答
0

就像其他人提到的那样,如果您的 INDEX 列都是 0 和 1 位,那么您不需要索引,并且 id 自动增量应该对主索引更有效。我猜 phone_call_id 是 INT 并且是唯一的?这是一个自动增量字段吗?

MySQL 在内部使用自动增量 id 索引,因此对于这样的表来说,拥有它是个好主意。

如果您使用 SHOW CREATE TABLE 帐户发布您的架构结构;显示创建表电话呼叫;等我们可以帮助你更多。

我将使用数据库 - 因为它只有 300k - 并在本地加载它,然后添加自动增量列,如果它不是 phone_call_id,删除所有其他索引,除了:phone_call_id、account_id、industry_id 和 call_code_id。

为了帮助你更多,我需要知道其他表的结构是什么,尤其是行的宽度和数量。

于 2013-04-10T00:13:12.193 回答