Вопросы о том, как индексировать мою базу данных - PullRequest
1 голос
/ 30 марта 2012

Пожалуйста, мне нужна ваша помощь с тем, как включить 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)

Большинство моих запросов вращаются вокруг INSERT INTO MAINTABLE, STUDENTS ..... затем SELECT ОТ MAINTABLE, STUDENTS и COURSES

Благодарим Вас за терпение и время.Я очень ценю это.Спасибо.

** ПРИМЕРЫ ЗАПРОСОВ "

                   $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 ]

3 голосов
/ 30 марта 2012

Это слишком общий вопрос, чтобы на него можно было дать хороший ответ, но я советую вам сосредоточиться на ваших предложениях WHERE - если вы много используете что-то в WHERE, то добавьте в него индекс, и это ускорит эти запросы.Кроме того, если вы делаете какие-либо объединения, ставьте индексы того, что вы используете в своих предложениях ON.Это настолько общее обобщение, что я ожидаю, что за него ответят, но общие вопросы порождают общие ответы.

Более конкретным было бы то, что вы показали свои структуры таблиц и фактически показали один или два запроса.Но тогда это становится очень близко к тому, что мы делаем вашу работу за вас.

Надеюсь, это поможет.

0 голосов
/ 31 марта 2012

Вы должны начать с выполнения всех запросов с EXPLAIN. Это должно показать вам несколько указателей.

Но если вы просите практическое правило, это будет общим указанием:

  • индексные столбцы, которые FOREIGN KEY в JOIN заявлениях
  • индексировать все столбцы, используемые в WHERE условиях
  • индексировать все столбцы, используемые в ORDER BY

Также, похоже, много поисков VARCHAR. Некоторая дополнительная нормализация может также дать полезные результаты. Легче искать level_id, чем level name.

Также, как примечание: пожалуйста, прекратите использовать древнюю функцию mysql_*. Им больше 10 лет, они больше не обслуживаются, и процесс их устаревания уже начался . Вместо этого вы должны начать использовать подготовленные операторы с PDO или MySQLi . Нельзя писать новый код с mysql_* API.

0 голосов
/ 30 марта 2012

Другой общий ответ: если вы ищете что-то в столбцах, которые содержат строковые данные, такие как имя или фамилия ученика, я бы посоветовал вам поставить индекс для этих столбцов.

Это увеличит скоростьполучения результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...