--
-- Podstawy powolnych zapytań: optymalizacja dostępu do danych
--

SELECT * FROM sakila.actor 
INNER JOIN sakila.film_actor USING(actor_id) 
INNER JOIN sakila.film USING(film_id) 
WHERE sakila.film.title = 'Academy Dinosaur'; 



ALTER TABLE sakila.film_actor DROP FOREIGN KEY fk_film_actor_film; 
ALTER TABLE sakila.film_actor DROP KEY idx_fk_film_id; 
EXPLAIN SELECT * FROM sakila.film_actor WHERE film_id = 1\G 



SELECT actor_id, COUNT(*)
FROM sakila.film_actor GROUP BY actor_id;



EXPLAIN SELECT actor_id, COUNT(*)
FROM sakila.film_actor GROUP BY actor_id\G



--
-- Sposoby restrukturyzacji zapytań
--

DELETE FROM messages
WHERE created < DATE_SUB(NOW(),INTERVAL 3 MONTH); 



SELECT * FROM tag 
JOIN tag_post ON tag_post.tag_id=tag.id 
JOIN post ON tag_post.post_id=post.id 
WHERE tag.tag='mysql'; 



SELECT * FROM  tag WHERE tag='mysql'; 
SELECT * FROM  tag_post WHERE tag_id=1234; 
SELECT * FROM  post WHERE  post.id in (123,456,567,9098,8904);



--
-- Podstawy wykonywania zapytań
--

<?php 
$link   = mysql_connect('localhost', 'user', 'p4ssword'); 
$result = mysql_query('SELECT * FROM HUGE_TABLE', $link); 
while ($row = mysql_fetch_array($result)) { 
   // Dowolny kod przetwarzający wyniki zapytania. 
} 
?>



<?php 
$link   = mysql_connect('localhost', 'user', 'p4ssword'); 
$result = mysql_unbuffered_query('SELECT * FROM HUGE_TABLE', $link); 
while ($row = mysql_fetch_array($result)) { 
   // Dowolny kod przetwarzający wyniki zapytania.
} 
?>



#!/usr/bin/perl 
use DBI; 
my $dbh = DBI->connect('DBI:mysql:;host=localhost', 'user', 'p4ssword'); 
my $sth = $dbh->prepare('SELECT * FROM HUGE_TABLE', { mysql_use_result => 1 }); 
$sth->execute(); 
while (my $row = $sth->fetchrow_array()) { 
   # Dowolny kod przetwarzający wyniki zapytania.
}



my $dbh = DBI->connect('DBI:mysql:;mysql_use_result=1', 'user', 'p4ssword');


EXPLAIN SELECT film.film_id, film_actor.actor_id 
FROM sakila.film 
INNER JOIN sakila.film_actor USING(film_id) 
WHERE film.film_id = 1; 



SELECT film.film_id 
FROM sakila.film 
LEFT OUTER JOIN sakila.film_actor USING(film_id) 
WHERE film_actor.film_id IS NULL;



SELECT film.film_id 
FROM sakila.film 
INNER JOIN sakila.film_actor USING(film_id) 
WHERE film.film_id > 500; 



SELECT film.film_id, film.title, film.release_year, actor.actor_id, 
actor.first_name, actor.last_name 
FROM sakila.film 
INNER JOIN sakila.film_actor USING(film_id) 
INNER JOIN sakila.actor USING(actor_id);



--
-- Ograniczenia optymalizatora zapytań MySQL
--

(SELECT first_name, last_name
 FROM sakila.actor
 ORDER BY last_name)
UNION ALL
(SELECT first_name, last_name
 FROM sakila.customer
 ORDER BY last_name)
LIMIT 20;



(SELECT first_name, last_name
 FROM sakila.actor
 ORDER BY last_name
 LIMIT 20)
UNION ALL
(SELECT first_name, last_name
 FROM sakila.customer
 ORDER BY last_name
 LIMIT 20)
LIMIT 20;



UPDATE tbl AS outer_tbl 
SET c = ( 
SELECT count(*) FROM tbl AS inner_tbl 
WHERE inner_tbl.type = outer_tbl.type 
); 



UPDATE tbl 
INNER JOIN( 
SELECT type, count(*) AS c 
FROM tbl 
GROUP BY type 
) AS der USING(type) 
SET tbl.c = der.c;



--
-- Optymalizacja określonego rodzaju zapytań
--

SELECT SUM(IF(color = 'blue', 1, 0)) AS blue, 
SUM(IF(color = 'red', 1, 0)) AS red FROM items;



SELECT COUNT(color = 'blue' OR NULL) AS blue, COUNT(color = 'red' OR NULL) 
AS red FROM items;



SELECT film.film_id, film.description 
FROM sakila.film 
INNER JOIN ( 
SELECT film_id FROM sakila.film 
ORDER BY title LIMIT 50, 5 
) AS lim USING(film_id);



SELECT film_id, description FROM sakila.film 
WHERE position BETWEEN 50 AND 54 ORDER BY position;



SELECT * FROM sakila.rental
ORDER BY rental_id DESC LIMIT 20;



SELECT * FROM sakila.rental
WHERE rental_id < 16030
ORDER BY rental_id DESC LIMIT 20;
