2011-01-30 97 views
0
SELECT * 
FROM tfdata,linkdata,gndata,serdata 
WHERE tfdata.web = linkdata.web 
    AND tfdata.web = gndata.web 
    AND tfdata.web = serdata.web 
    AND tfdata.web = '"mysql_real_escape_string($uri)"'" 

我觉得这种方法很慢,想知道会LEFT JOIN这个工作?如果是,我如何添加相同的?或者还有其他方面吗?如何优化此查询?

+0

请为每个表格和`EXPLAIN SELECT ...`的输出发布`SHOW CREATE TABLE ...`的输出。 – 2011-01-30 10:31:46

回答

1

您可以使用连接重写您的查询。它会使它更具可读性,但不会更快。

SELECT * 
FROM tfdata 
JOIN linkdata ON tfdata.web = linkdata.web 
JOIN gndata ON tfdata.web = gndata.web 
JOIN serdata ON tfdata.web = serdata.web 
WHERE tfdata.web = 'some_uri' 

该语法的一个优点(但不是唯一的一个)是,它使从使用内部联接到外部联接更容易。

为了优化,我首先运行EXPLAIN SELECT ...来检查您在每个表上的列web上的索引,并且该索引实际上被优化器使用。如果索引丢失,那么添加索引很可能会提高查询的速度。

如果查询返回很多行或列,可以通过仅返回所需的列并仅返回前几行并实现分页(如果要查看更多行)来提高性能。

+0

是的,我确实有每个表的不寻常的索引 – leon 2011-01-30 10:42:16

0
SELECT * FROM 
    (SELECT * FROM tfdata WHERE tfdata.web='"mysql_real_escape_string($uri)"'") As Result1,linkdata,gndata,serdata 
    WHERE Result1.web = linkdata.web AND Result1.web = gndata.web AND Result1.web = serdata.web 

使用内联选择可以获得包含较少项目的结果表,然后将它们连接在一起。

1

您可以命名您正在显示的单元格而不是“*”。这将提高性能......