Php 查询的执行时间太长

Php 查询的执行时间太长,php,mysql,sql,Php,Mysql,Sql,我正在尝试从MySQL数据库中获取学生的所有课程。这段代码只获取了1门课程,但总共有6门,然后需要15秒。我试图通过使用选项标记中的选定属性显示已设置的课程(如果有)。我认为这就是导致查询执行这么长时间的原因。 我的数据库设计有问题吗?如何改进查询 这是数据库的结构。我创建了一个中间表user\u courses: 用户: 用户id 课程使用者: 用户id 课程编号1 课程编号2 课程编号3 课程编号4 课程编号5 课程编号6 课程编号7 课程: 课程号 课程名称 <?php se

我正在尝试从MySQL数据库中获取学生的所有课程。这段代码只获取了1门课程,但总共有6门,然后需要15秒。我试图通过使用选项标记中的选定属性显示已设置的课程(如果有)。我认为这就是导致查询执行这么长时间的原因。 我的数据库设计有问题吗?如何改进查询

这是数据库的结构。我创建了一个中间表user\u courses:

用户: 用户id

课程使用者: 用户id 课程编号1 课程编号2 课程编号3 课程编号4 课程编号5 课程编号6 课程编号7

课程: 课程号 课程名称

<?php
    session_start();
    $_SESSION['user_id'] = 1;
    require ('../mysqli_connect.php');

    echo '<table><tr><td><select name="course_id_1">';

    // checking if a user has already chosen a 1st course (out of 6)
    $query = "SELECT c.course_id
              FROM courses AS c
              INNER JOIN users_courses AS u
              ON c.course_id = u.course_id_1
              WHERE u.user_id = {$_SESSION['user_id']}";
    $result = mysqli_query($dbc, $query);

    // if yes, assign the selected course from the database to a variable
    if (mysqli_num_rows($result) == 1) {
        $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
        $selected_course = $row['course_id'];
    }

    // fetch courses, and make 'None' the first option in the drop down menu
    $query = "SELECT course_id, course_name 
              FROM courses 
              ORDER BY (course_name = 'None') DESC, course_name";
    $result = mysqli_query($dbc, $query);

    // create the drop down menu
    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
        // select default value
        if ($selected_course == $row['course_id']) {
            $selected =' selected';
        } else {
            $selected='';
        }

        echo '<option value="' . $row['course_id'] . '"' . $selected . '>'
              . htmlspecialchars($row['course_name']) . '</option>';
    }

    echo '</select></td></tr>';

    mysqli_free_result($result);
    mysqli_close($dbc); 
?>

试试这个。。。这将创建jeff提到的索引

CREATE INDEX _index_course ON courses(course_id);
CREATE INDEX _index_user_course ON users_courses(course_id_1);

试试这个。。。这将创建jeff提到的索引

CREATE INDEX _index_course ON courses(course_id);
CREATE INDEX _index_user_course ON users_courses(course_id_1);

这里有很多问题

1您对表结构的解释不足以诊断一些常见问题,例如缺少索引,或者您已将什么设置为主键。这些选择会对性能产生巨大影响

2您的用户\课程表已非规范化;对多对多关系建模的一种更常见的方法是为每个连接的表使用一个外键的表。在这种情况下,您的表将如下所示:

USERS_COURSES
-------------
user_id
course_id
然后一个有7门课程的用户在该表中会有7条记录。如果了解优先级(如first choice)对模型来说非常重要,那么可以使用适当的列扩展联接表


3您的PHP代码是完全开放的,因为您直接将用户输入插入到查询中。您需要解决这个问题,并采取始终使用绑定变量的做法。您在这里遇到了许多问题

1您对表结构的解释不足以诊断一些常见问题,例如缺少索引,或者您已将什么设置为主键。这些选择会对性能产生巨大影响

2您的用户\课程表已非规范化;对多对多关系建模的一种更常见的方法是为每个连接的表使用一个外键的表。在这种情况下,您的表将如下所示:

USERS_COURSES
-------------
user_id
course_id
然后一个有7门课程的用户在该表中会有7条记录。如果了解优先级(如first choice)对模型来说非常重要,那么可以使用适当的列扩展联接表


3您的PHP代码是完全开放的,因为您直接将用户输入插入到查询中。您需要修复这一问题,并采取始终使用绑定变量的做法

您的索引是什么?我在这段代码中没有任何索引。进行一些分析,我不知道连接需要多少时间。您的索引是什么?我在这段代码中没有任何索引。进行一些分析,我不知道连接需要多少时间。为什么会出现SQL注入攻击?我没有输入任何文本数据。您从$\u会话变量获取用户提供的内容,并将其直接传递给数据库服务器。阅读@帕尔帕蒂姆提供的链接。为什么它会受到SQL注入攻击?我没有输入任何文本数据。您从$\u会话变量获取用户提供的内容,并将其直接传递给数据库服务器。阅读@Perpatim提供的链接。