2012-03-30 5 views
1

INDEXESをテーブルに含める方法についての助けが必要です。私はいくつかのチュートリアルでそれについて読んだことがありますが、それでも私のデータベースに実装することはできません。私のデータベースの効率を上げるには: 私はphp_apc.dllをwampserverにインストールしました。それは少し速くて、私は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) 

である私のクエリのほとんどはSTUDENTSCOURSES

はあなたの忍耐をありがとう、MAINTABLE FROM SELECTそして..... MAINTABLE INTOラウンド INSERTSTUDENTSを公転しますと時間。私はそれを高く評価します。おかげさまで クエリの

**例」

    $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

実行中のクエリを表示しないようにすることはできません。 – Madbreaks

+1

ブラインドアドバイス:WHERE句を表示するものをすべて検索します。より良いアドバイス:フィルタリングの際に大きな可能性のあるものをインデックス化する。 – Corbin

+1

他のブラインドアドバイス、インデックス結合で使用されているすべてのもの – Ascherer

答えて

0

すべてのクエリをEXPLAINで実行してください。それはあなたにいくつかの指針を示すはずです。

しかし、あなたが経験則を求めているならば、これは一般的なガイドラインのようになります。FOREIGN KEYJOINで文です

  • 索引列
  • インデックスWHERE条件
  • で使用されるすべての列使用するすべての列のインデックスORDER BY

また、多くのVARCHAR searc彼は。いくつかの追加のnormalizationも有益な結果をもたらすかもしれません。 level_id、次にlevelという名前を検索する方が簡単です。

また、メモとして:古代のmysql_*機能の使用を中止してください。彼らは10歳以上で、もはや維持されておらず、非推奨にするプロセスはhad already begunです。代わりに、PDOまたはMySQLiprepared statementsを使用して開始する必要があります。 mysql_* APIで新しいコードを書くべきではありません。

3

これは、ここにも答えられるには少しあまりにも一般的です、しかし、私の指針はあなたのWHERE句に焦点を当てることです。WHERE節で何かを使用してインデックスを作成すると、それらのクエリが高速になります。また、ジョインを行う場合は、それはあまりにも一般化されているので、私はそれを言い聞かせることを期待していますが、一般的な質問は一般的な答えです。

より具体的には、テーブル構造を表示し、実際に1つまたは2つのクエリを表示します。しかし、それはあなたのためにあなたの仕事を行うことに貴重なものになります。

これが役に立ちます。

+0

お時間をいただきありがとうございます。私は実行しているクエリの例を更新しました。それに応じて助言してください。ありがとうございました –

+0

私は "あなたが任意の結合を行う場合"が好きです。 –

0

もう1つの一般的な答えは、生徒の名前や姓などの文字列データが含まれている列を検索する場合、その列にインデックスを付けることをお勧めします。

これにより検索結果のスピードが向上します。

+0

答えをありがとう。更新された質問を確認して、あなたのアドバイスをお願いします。 –

+0

D Macの答えと同じように、結合に従って、 "ON"ステートメントの両側で使用する列にインデックスを配置してみてください。 また、whereステートメントを確認してください。 – selo

+0

Indexesを置く列の中には、 "level"、 "matric_no"、 "course_code"、 "score"があります。私は基本的な考えを得ることを願っています。 – selo

関連する問題