效率低下的SQL查询

Pau*_*vis 14 php mysql database performance mysqli

我正在建立一个简单的网络应用程序,我有一天会开源.就目前而言,导航是在每个页面加载时生成的(将在一天内更改为缓存)但是目前,它是使用下面的代码制作的.使用PHP 5.2.6和MySQLi 5.0.7.7,以下代码的效率如何?我认为加入可能会有所帮助,但我会接受建议.任何提示将非常感谢.

<?php
    $navQuery = $mysqli->query("SELECT id,slug,name FROM categories WHERE live=1 ORDER BY name ASC") or die(mysqli_error($mysqli));
    while($nav = $navQuery->fetch_object()) {
        echo '<li>';
            echo '<a href="/'. $nav->slug .'">'. $nav->name .'</a>';
            echo '<ul>';
                $subNavQuery = $mysqli->query("SELECT id,name FROM snippets WHERE category='$nav->id' ORDER BY name ASC") or die(mysqli_error($mysqli));
                while($subNav = $subNavQuery->fetch_object()) {
                    echo '<li>';
                        echo '<a href="/'. $nav->slug .'/'. $subNav->name .'">'. $subNav->name .'</a>';
                    echo '</li>';
                }
            echo '</ul>';
        echo '</li>';
    }
?>
Run Code Online (Sandbox Code Playgroud)

vbe*_*nce 15

您可以运行此查询:

SELECT c.id AS cid, c.slug AS cslug, c.name AS cname,
    s.id AS sid, s.name AS sname
FROM categories AS c
    LEFT JOIN snippets AS s ON s.category = c.id
WHERE c.live=1
ORDER BY c.name, s.name
Run Code Online (Sandbox Code Playgroud)

然后迭代结果以创建正确的标题,如:

// last category ID
$lastcid = 0;
while ($r = $navQuery->fetch_object ()) {

    if ($r->cid != $lastcid) {
        // new category

        // let's close the last open category (if any)
        if ($lastcid)
            printf ('</li></ul>');

        // save current category
        $lastcid = $r->cid;

        // display category
        printf ('<li><a href="/%s">%s</a>', $r->cslug, $r->cname);

        // display first snippet
        printf ('<li><a href="/%s/%s">%s</a></li>', $r->cslug, $r->sname, $r->sname);

    } else {

        // category already processed, just display snippet

        // display snippet
        printf ('<li><a href="/%s/%s">%s</a></a>', $r->cslug, $r->sname, $r->sname);
    }
}

// let's close the last open category (if any)
if ($lastcid)
    printf ('</li></ul>');
Run Code Online (Sandbox Code Playgroud)

请注意我使用printf但你应该使用自己的函数来包装printf,但是htmlspecialchars通过参数运行(当然除了第一个).

免责声明:我不一定鼓励使用<ul>s.

此代码仅用于显示使用一个查询处理分层数据的基本思想.