Нахождение узкого места в SQL-запросах - PullRequest
2 голосов
/ 11 мая 2011

Я учу SQL.Чтобы отточить свои навыки, я нашел загадку SQL на Coderloop.com.(Отличный сайт для программирования головоломок, кстати).В настоящее время я работаю над этой загадкой:

http://www.coderloop.com/puzzles/university

Я очень близок к решению.Мне просто нужно оптимизировать мой код.Головоломка требует от вас создания базы данных каталога курсов, а также запросов типа «добавить студента в курс» или «получить сведения о курсе».У меня, как мне кажется, есть рабочее решение.Я проверил это с моими собственными данными, и это, кажется, работает хорошо.Но Coderloop использует тысячи запросов для стресс-тестирования схемы и запросов моей базы данных.К сожалению, мое решение не удается из-за тайм-аута около 4 минут или около того.Я пересмотрел свою схему и запросы и не могу найти узкое место.Любые идеи о том, как изменить мою базу данных или запросы, чтобы ускорить процесс?

Примечания:

  • Выполняется на сервере MySQL
  • ? S - это параметры тестовых данных, переданных ботом Coderloop.См. Самый низ этой страницы .

Моя душа

Настройка базы данных

CREATE TABLE students (
    sid int NOT NULL,
    name varchar(255),
    surname varchar(255),
    email varchar(255),
    faculty varchar(255),
    matriculation int,
    PRIMARY KEY (sid)
    );

CREATE INDEX stu_index ON students (sid);   
CREATE TABLE professors (
    pid int NOT NULL,
    name varchar(255),
    surname varchar(255),
    email varchar(255),
    faculty varchar(255),
    telephone varchar(255),
    PRIMARY KEY (pid)
);
CREATE INDEX pro_index ON professors (pid); 
CREATE TABLE courses (
    course_name varchar(255) NOT NULL,
    pid int,
    credits int,
    subject varchar(255),
    PRIMARY KEY (course_name)
);
CREATE INDEX cou_index ON courses (course_name);    
CREATE TABLE enrollment (
    course_name varchar(255),
    sid int
);

Добавить нового профессора

INSERT INTO professors (name, surname, email, faculty, telephone, pid)  VALUES (?, ?, ?, ?, ?, ?);

Добавить нового студента

INSERT INTO students (name, surname, email, faculty, matriculation, sid)  VALUES (?, ?, ?, ?, ?, ?);

Добавить новый курс

INSERT INTO courses (course_name, subject, credits)  VALUES (?, ?, ?);

Добавить существующего профессора в существующий курс

(Этот сумасшедший синтаксис соответствует порядку параметров, передаваемых в? S)

Update courses Set pid = Case When course_name = ? Then ? Else pid End;

Добавить существующего студентана существующий курс

INSERT INTO enrollment (course_name, sid) VALUES (?, ?);

Получить список студентов, посещающих курс

SELECT name, surname FROM students JOIN enrollment ON students.sid=enrollment.sid WHERE course_name=?;

Получить профессора, владеющего курсом

SELECT name, surname, professors.pid FROM professors JOIN courses ON professors.pid=courses.pid WHERE course_name=?;

Получить сведения о курсе

SELECT subject, credits FROM courses WHERE course_name=?;

Получить сведения о преподавателе

SELECT name, surname, email, faculty FROM professors WHERE pid=?;

Получить сведения о студенте

SELECT name, surname, email, faculty, matriculation FROM students WHERE sid=?;

Удалить студента из курса

DELETE FROM enrollment WHERE sid=? AND course_name=?;

Заменить профессора в курсе

UPDATE courses SET pid=? WHERE course_name=?;

Ответы [ 2 ]

1 голос
/ 11 мая 2011

Добавить индексы для полей первичного и внешнего ключей. Это поможет совсем немного.

Кроме того, убедитесь, что у вас есть индексы для полей, включенных в предложения WHERE и ORDER BY (в дополнение к полям FK)

В конечном итоге: вам, вероятно, понадобится сузить круг вопросов, к которым относятся конкретные запросы, которые выполняются медленно, чтобы вы могли сосредоточить свои усилия там.

0 голосов
/ 11 мая 2011

думаю, что вам нужно

CREATE INDEX enr_coursename ON enrollment(course_name);
CREATE INDEX co_pid ON courses(pid);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...