2012-08-08 116 views
0

我有以下3个表:MySQL的优化:LEFT JOIN

出版物(主键= 文章

article | title | pubType 

作者(主键= * AUTHOR_NAME *)

author_name | author_somethingelse 

pub_author_map

article | author_name 

给定值pubType,我需要选择有关的文章,包括作者的信息。要做到这一点,我有

SELECT p.article, p.title, p.dateTime, pam.author_name FROM publications p 
LEFT JOIN pub_author_map pam ON pam.article = p.article 
LEFT JOIN authors a ON a.author_name = pam.author_name 
WHERE p.pubType = '$pubType' ORDER BY p.article LIMIT 10 

即使有LIMIT 10,这个查询在约29秒入。 publications中有1500行,pub_author_map中有3000行。

如何优化上述查询?

+0

请注意,LIMIT不会限制sql数据集,而是限制输出。因此,它不应该用于生产。 – 2012-08-08 16:52:26

+0

@SebastianHojas你是说LIMIT不应该用于生产? ? – 2012-08-08 16:54:50

+0

关于你的注意事项:首先想出一个提供正确结果的查询,然后重写它比其他方式快速工作要好得多。没有理由让作者脱离示例。我们大多数人可以处理三种方式的联接。 – 2012-08-08 16:55:39

回答

1

在列pubType

添加在列文章indicies

  • pub_author_map

  • 出版物例如这个样子。

    CREATE INDEX pub_author_idx_1 
        ON pub_author_map (article); 
    
    CREATE INDEX publications_idx_1 
        ON publications (pubType); 
    
+0

我看指数需要一些时间来创建... – Don 2012-08-08 17:38:48

+0

这可能是,但以后你节省时间。 – hol 2012-08-08 17:46:44

+0

是的,大大改善,谢谢! – Don 2012-08-08 20:37:48

1

您可以使用索引优化表。在检索数据时用作外键的索引列:这里是编制索引的好教程,http://www.tizag.com/mysqlTutorial/mysql-index.php索引将占用更多的磁盘空间,但是当您对数据库中的数据相对较多的数据进行查询时,它们可以节省数小时。

1

如果INNER JOIN提供正确的结果,请使用它。只有在您需要它提供的结果时才使用LEFT JOIN。

你是否曾经想看到没有作者的文章?

+0

不,我不想看到那些;我实际上遵循了OMG Ponies的方法http://stackoverflow.com/questions/3151919/mysql-update-with-2-inner-joins-hangs – Don 2012-08-08 17:02:19