2012-12-13 33 views
0

的效率这是一个理论上的例子 - 我已经提出作为帮助我学习的方式的问题。我很感谢任何指点和解释,因为当涉及到大型数据库时,我不仅仅是业余爱好者,而是热衷于了解更多。提高SQL语句

以下SQL即将被800万条记录,可以做些什么来提高效率的数据库上运行?

SELECT 
    email_subscribers_extra.sendscont, 
    email_list_subscribers_new.subscriberid, 
    email_subscribers_extra.lastopen  
FROM 
    email_list_subscribers_new 
LEFT JOIN 
    email_subscribers_extra ON email_subscribers_extra.subscriberid = email_list_subscribers_new.subscriberid 
WHERE 
    email_list_subscribers_new.partner = 'AJ' 
ORDER BY 
    email_subscribers_extra.lastsend ASC LIMIT 0, 40000 

编辑: 让我们假定它是一个Linux的Apache,MySQL服务器因为这是我通常使用。目前没有索引集。

+3

那么,对于一个:'LIMIT'是** **没有任何ANSI/ISO SQL标准的一部分......所以你已经是在什么数据库系统甚至支持这种非常具体.... –

+1

有什么有问题的表上的索引? –

+1

EXPLAIN PLAN会告诉你比这里任何人都更好。 – duffymo

回答

2

提高效率是SQL调谐加载短语。您通常会添加索引以加快SELECT性能,但添加索引通常会降低更新速度。每个INSERT和DELETE语句都需要重写索引。许多UPDATE语句也需要重写索引。

不看执行计划,并在不考虑INSERT,UPDATE效果和DELETE语句,我建议在

  • 增加索引的WHERE子句中使用的每一列,
  • 每在JOIN条件使用柱,
  • 在ORDER BY使用每一列。

大多数dbms会自动将索引添加到外键引用中使用的列。不过,其中至少有一些会让你稍后放弃这个索引。

所以添加索引,或者确保支持外键约束的索引存在,在这些列。

  • email_list_subscribers_new.subscriberid
  • email_list_subscribers_new.partner
  • email_subscribers_extra.subscriberid
  • email_subscribers_extra.lastsend

在某些情况下,一个多列索引会给你两个多更好地选择性能单列索引。