2015-10-05 66 views
1

我有一张1510万条记录的表。我正在运行以下查询来处理重复检查的记录。使用正确的索引优化mysql查询

select id, name, state, external_id 
from companies 
where dup_checked=0 
order by name 
limit 500; 

当我使用EXPLAIN扩展上它使用的index_companies_on_name指数这仅仅是对公司名称的指标告诉我的查询。我假设这是由于订购。我试图创建基于名称和dup_checked字段的其他索引,希望它会使用这个,因为它可能会更快,但它仍然使用index_companies_on_name索引。

最初它速度不够快,但现在我们已经下降到330万条记录,并且这个查询最多需要90秒才能执行。我不太确定还有什么可以做得更快。是一个不同的索引答案或我没有想到的其他东西?谢谢。

+1

通常情况下,您会构建索引以首先包含'WHERE'条件,其次''ORDER'条件。在这种情况下:'dup_checked,name'。 – tadman

+0

如何指定索引中字段的顺序?我正在使用mysql工作台,它只允许你勾选索引中包含哪些字段。并且这会对性能产生重大影响吗? –

+0

我也想知道如果我处理500条记录并将它们的dup_checked标志标记为true,那将需要reindex更新正确吗?意思可能会减慢它? –

回答

1

一般这里的关键是要创建一个过滤器第一,减少行(“基数”)的数量指标,并已申请其次顺序:

CREATE INDEX `index_companies_on_dup_checked_name` 
    ON `companies` (`dup_checked`,`name`) 

这应该给你你需要的范围。