Optimising Queries Optimising Queries For Fun And Profit For Fun And Profit Andrew Godwin / @andrewgodwin Andrew Godwin / @andrewgodwin flickr.com/stuckincustoms flickr.com/stuckincustoms
· Indexes, joins or replication · Indexes, joins or replication Things a database gives you over a flat file Things a database gives you over a flat file
Databases still need you. Databases still need you. They can't solve every problem without hints They can't solve every problem without hints flickr.com/96dpi flickr.com/96dpi
photos = [] photos = [] for person in People.objects.all(): for person in People.objects.all(): photos.append(person.photo.file) photos.append(person.photo.file)
photos = [] photos = [] for person in People.objects.select_related("photo"): for person in People.objects.select_related("photo"): photos.append(person.photo.file) photos.append(person.photo.file)
1 million rows JOINed with 1 million rows 1 million rows JOINed with 1 million rows ...is 1,000,000,000,000 potential comparisons ...is 1,000,000,000,000 potential comparisons
SELECT * FROM people_person WHERE age > 13 AND foo; SELECT * FROM people_person WHERE age > 13 AND foo; SELECT * FROM people_photo WHERE id = 42; SELECT * FROM people_photo WHERE id = 42; SELECT * FROM people_photo WHERE id = 31; SELECT * FROM people_photo WHERE id = 31; SELECT * FROM people_photo WHERE id = 214; SELECT * FROM people_photo WHERE id = 214; SELECT * FROM people_photo WHERE id = 84; SELECT * FROM people_photo WHERE id = 84; SELECT * FROM people_photo WHERE id = 28; SELECT * FROM people_photo WHERE id = 28; SELECT * FROM people_photo WHERE id = 90; SELECT * FROM people_photo WHERE id = 90;
SELECT * FROM people_person AS pr SELECT * FROM people_person AS pr INNER JOIN people_photo AS ph ON ph.id = pr.photo_id INNER JOIN people_photo AS ph ON ph.id = pr.photo_id WHERE age > 13 AND foo; WHERE age > 13 AND foo;
# explain select * from aeblog_post where id = 50; # explain select * from aeblog_post where id = 50; QUERY PLAN QUERY PLAN --------------------------------------------------- --------------------------------------------------- Index Scan using aeblog_post_pkey on aeblog_post Index Scan using aeblog_post_pkey on aeblog_post (cost=0.00..8.27 rows=1 width=1812) (cost=0.00..8.27 rows=1 width=1812) Index Cond: (id = 50) Index Cond: (id = 50)