0

所以我有一个朋友的网站,我正试图帮助他优化查询,因为他收到了来自主机的电子邮件,说他的网站eating资源太多。所以看着这个查询我在想,有什么方法可以更快或更智能(消耗更少的时间或更少的内存)我不知道哪种方法是最好的方法,可能是准备好的语句或对当前代码的一些改进。

$query=@mysql_query("
    SELECT 
        tl.title, 
        tl.dt, 
        tk.nr as nr2, 
        tk.name as cat, 
        tf.name, 
        tf.type, 
        tf.alt,
        tt.trupi
    FROM 
        ".$tab['news']." as tl, 
        ".$tab['category']." as tk, 
        ".$tab['foto']." as tf, 
        ".$tab['entry']." as th, 
        ".$tab['body']." as tt
    WHERE 
        tl.nr = '$nr' AND 
        tl.foto = tf.nr AND 
        tl.kategoria = tk.nr AND 
        tl.hyrja = th.nr AND 
        tl.trupi = tt.nr");

我会很感激你的所有建议,谢谢。

4

3 回答 3

2

首先,您可以使用 ANSI 92 连接语法。

结合摆脱两个字母的首字母缩写词,这将有助于更清楚地了解您的查询在做什么。

于 2012-09-11T10:30:38.670 回答
1

也许试试...

$nr = mysql_real_escape_string( $nr );

$tab['category'] = mysql_real_escape_string( $tab['category'] );
$tab['foto']     = mysql_real_escape_string( $tab['foto'] );
$tab['entry']    = mysql_real_escape_string( $tab['entry'] );
$tab['body']     = mysql_real_escape_string( $tab['body'] );

$query = @mysql_query("
    SELECT 
        tl.title, 
        tl.dt, 
        tk.nr as nr2, 
        tk.name as cat, 
        tf.name, 
        tf.type, 
        tf.alt,
        tt.trupi
    FROM 
        ".$tab['news']." as tl
        LEFT JOIN ".$tab['category']." as tk ON ( tk.nr = tl.kategoria )
        LEFT JOIN ".$tab['foto']." as tf ON ( tf.nr = tl.foto )
        LEFT JOIN ".$tab['entry']." as th ON ( th.nr = tl.hyrja )
        LEFT JOIN ".$tab['body']." as tt ON ( tt.nr = tl.trupi )
    WHERE 
        tl.nr = '$nr'");

请注意在 SQL 字符串中使用变量之前对其进行转义(请参阅Bobby 表。)

要记住的另一件事是数据库的整体设计。如果表之间存在“一对一”关系的任何实例,则应将这两个表折叠成一个表,等等。

于 2012-09-11T10:57:01.703 回答
0

无需对每个表都使用 as,也可以Explain用于检查查询的优化程度,您可以在此处找到一个很好的指南http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing- MySQL-Queries-and-Indexes.htm关于如何解释解释的结果

所有添加到查询的操作都会以一种或另一种方式降低性能,但我认为瓶颈在于连接本身以及关联表的方式。在将一个表与另一个表关联时尝试使用整数(ids),如果不可能,请确保您关联的列已编入索引。我可以肯定,这会增加您的查询。

于 2012-09-11T10:28:30.023 回答