关于如何索引我的数据库的问题

时间:2012-03-30 18:09:22

标签: php mysql optimization indexing database-optimization

我需要你的帮助,如何在我的表中包含INDEXES,我已经在几个教程中阅读了它,但仍然无法在我的数据库中实现它。为了提高我的数据库的效率: 我已经在wampserver上安装了php_apc.dll并且速度更快了,我还尝试避免在我的查询中使用SELECT * 。但是如何实现INDEX是我的问题。如果你能指出它对INDEX有什么帮助,我会很高兴的。

这是我的数据库架构

  Database: RESULTS
  -------------------

   Table: STUDENTS
   - studentID (int)
   - first_name (varchar)
   - last_name (varchar)
   - other_name (varchar)

   Table: COURSES
   - courseID (int)
   - course_code (varchar)
   - course_title (varchar)
   - course_unit (int)

   Table: SEMESTER
   - semesterID
   - semester_name

   Table: MAINTABLE
   - scoresID (int)
   - courseID (int)
   - studentID (int)
   - semester_name (varchar)
   - session (varchar) 
   - score (int)
   - grade (varchar)
   - remarks (varchar)

我的大部分疑问都围绕着 INSERT INTO MAINTABLESTUDENTS .....然后SELECT来自MAINTABLESTUDENTSCOURSES

感谢您的耐心和时间。我最欣赏它。 感谢。

**查询示例“

                   $query2 = mysql_query("SELECT       first_name, last_name
        FROM students 
      WHERE matric_no = '".$matric_no."' ");
    ($row2 = mysql_fetch_array($query2)); 

    $query3 = mysql_query("SELECT  SUM(c.        course_unit) AS 'TOTAL'
               FROM    maintable AS m  
           INNER JOIN students AS s ON
                m.matric_no = s.matric_no
          INNER JOIN courses AS c ON
             m.course_code = c.course_code
       WHERE m.matric_no = '".$matric_no."'
          AND m.level = '".$level."'") or 
 die (mysql_error());

             $query4 = mysql_query("SELECT  c.          course_unit, m.score 
         FROM    maintable AS m  
                 INNER JOIN students AS s ON
                      m.matric_no = s.matric_no
                  INNER JOIN courses AS c ON
           m.course_code = c.course_code
      WHERE m.matric_no = '".$matric_no."'
                      AND m.level = '".$level."'") 
      or die (mysql_error()); 

              $query5 = mysql_query("SELECT  c.         course_unit, m.score 
             FROM    maintable AS m  
         INNER JOIN students AS s ON
             m.matric_no = s.matric_no
                     INNER JOIN courses AS c ON
                 m.course_code = c.course_code
     WHERE m.matric_no = '".$matric_no."'")           or die (mysql_error()); 


    $query6 = mysql_query("SELECT  SUM(c.              course_unit) AS 'TOTAL'
                     FROM    maintable AS m  
                      INNER JOIN students AS s ON
                              m.matric_no = s.matric_no
                      INNER JOIN courses AS c ON
                 m.course_code = c.course_code
      WHERE m.matric_no = '".$matric_no."'")           or die (mysql_error());     



            $query7 = mysql_query("SELECT  m.                            course_code AS 'Course Code',        c.course_title AS 'Course Title'
 , c.course_unit AS 'Unit',
  m.score AS 'Score', m.grade AS 'Grade'
                      FROM    maintable AS m  
                      INNER JOIN students AS s ON
                m.matric_no = s.matric_no
                      INNER JOIN courses AS c ON
                 m.course_code = c.course_code
  WHERE m.matric_no = '".$matric_no."'
  AND m.level = '".$level."'") 
   or die (mysql_error());
               $number_cols = mysql_num_fields         ($query7);

            $query8 = mysql_query("SELECT  m.         score, m.course_code 
                      FROM    maintable AS m  
                      INNER JOIN students AS s ON
                              m.matric_no = s.matric_no
                      INNER JOIN courses AS c ON
                 m.course_code = c.course_code
         WHERE m.matric_no = '".$matric_no."'
      AND m.score >= 0 AND m.score < 40 ")         or die (mysql_error());

                   $query9 = mysql_query("SELECT          m.grade, m.course_code 
                      FROM    maintable AS m  
                      INNER JOIN students AS s ON
                              m.matric_no = s.matric_no
                      INNER JOIN courses AS c ON
               m.course_code = c.course_code
         WHERE m.matric_no = '".$matric_no."'
                      AND m.grade = 'AR'") 
    or die (mysql_error());

请原谅我的格式化。我从手机输入。感谢您的时间。

3 个答案:

答案 0 :(得分:3)

这有点过于笼统,不能在这里得到很好的解答,但我对你的指导是关注你的WHERE子句 - 如果你在WHERE中使用了很多东西,那么就在它上面放一个索引,它会使这些查询更快。此外,如果您进行任何连接,请将索引放在ON子句中使用的内容上。这太笼统了,我希望能够说出来,但是一般性的问题都会引起一般性的回答。

更具体的是你展示你的表结构并实际显示一两个查询。但是接下来我们为你做的工作非常接近。

希望这有帮助。

答案 1 :(得分:0)

另一个一般的答案是,如果您在包含学生姓名或姓氏等字符串数据的列中搜索某些内容,我建议您在这些列上添加索引。

这会提高检索结果的速度。

答案 2 :(得分:0)

您应首先使用EXPLAIN运行所有查询。那应该会给你一些指示。

但如果你要求经验法则,这将是一般准则:

  • FOREIGN KEY语句中JOIN的索引列
  • 索引WHERE条件
  • 中使用的所有列
  • 索引ORDER BY
  • 中使用的所有列

此外,似乎还有很多VARCHAR搜索。一些额外的normalization也可能会带来有益的结果。搜索level_id然后搜索level名称会更容易。

另外,作为旁注:请停止使用古老的mysql_*功能。它们已有10年以上的历史,不再维护,并且不推荐使用它们had already begun。相反,您应该开始使用prepared statementsPDO MySQLi。不应该使用mysql_* API编写新代码。