Я учу 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=?;