如何优化此查询?

时间:2011-01-30 10:26:56

标签: mysql sql database query-optimization

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会对此有所了解吗?如果是,我如何添加相同的,或者还有其他方法吗?

3 个答案:

答案 0 :(得分: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上是否有索引,并且优化程序实际上正在使用此索引。如果索引丢失,那么添加它很可能会提高查询速度。

如果查询返回了很多行或列,那么只需返回所需的列,并且只返回前几行并实现分页,如果要查看更多行,则可以提高性能。

答案 1 :(得分:1)

您可以为要查找的单元格命名,而不是“*”。那会改善表现......

答案 2 :(得分: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 

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