mysql - Finding SQL Query Bottleneck -
i learning sql. sharpen skills, i've found sql puzzle on coderloop.com. (great website programming puzzles, btw). working through puzzle:
http://www.coderloop.com/puzzles/university
i close solution. need optimize code. puzzle requires design course catalog database, along queries "add student course" or "get course details". have, think, working solution. have tested own data, , seems perform fine. coderloop uses thousands of queries stress test database schema , queries. unfortunately, solution fails due timeout after 4 minutes or so. have reviewed schema , queries , can't find bottleneck. ideas on how redesign database or queries speed things up?
notes:
- executes on mysql server
- the ?s parameters of test data passed coderloop bot. see bottom of page.
my soultion
setup database
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 );
add new professor
insert professors (name, surname, email, faculty, telephone, pid) values (?, ?, ?, ?, ?, ?);
add new student
insert students (name, surname, email, faculty, matriculation, sid) values (?, ?, ?, ?, ?, ?);
add new course
insert courses (course_name, subject, credits) values (?, ?, ?);
add existing professor existing course
(this crazy syntax match order of paramaters passed ?s)
update courses set pid = case when course_name = ? ? else pid end;
add existing student existing course
insert enrollment (course_name, sid) values (?, ?);
get list of students attending course
select name, surname students join enrollment on students.sid=enrollment.sid course_name=?;
get professor owning course
select name, surname, professors.pid professors join courses on professors.pid=courses.pid course_name=?;
get course details
select subject, credits courses course_name=?;
get professor details
select name, surname, email, faculty professors pid=?;
get student details
select name, surname, email, faculty, matriculation students sid=?;
remove student course
delete enrollment sid=? , course_name=?;
replace professor in course
update courses set pid=? course_name=?;
add indexes on primary , foreign key fields. quite bit.
also, make sure have indexes on fields involved in , order clauses (in addition fk fields)
ultimately: going need narrow down specific queries ones performing can focus efforts there.
Comments
Post a Comment