This is the query, I use to count the total number of rows (I need this for pagination)
$sql = "SELECT count(tmdb_id),group_concat(genres.genres_name) AS genres_name
FROM `tmdb_movies`
JOIN genres USING (tmdb_id)
WHERE 1=1
AND EXISTS( SELECT 1 FROM genres WHERE tmdb_movies.tmdb_id = genres.tmdb_id AND genres.genres_name = '$genres1' )
AND EXISTS( SELECT 1 FROM genres WHERE tmdb_movies.tmdb_id = genres.tmdb_id AND genres.genres_name = '$genres2' )
GROUP BY tmdb_movies.tmdb_id";
$result = $conn->prepare($sql);
$result->execute();
$totalrows = $result->rowCount();
Screenshot of this query with EXPLAIN
statement
This is the SQL query, I use to echo results
$stmt = $conn->prepare("SELECT tmdb_movies.movie_title,tmdb_movies.tmdb_id
,GROUP_CONCAT(DISTINCT videos.videos_key) as videos_key
,GROUP_CONCAT(DISTINCT videos.videos_name) as videos_name
,GROUP_CONCAT(DISTINCT genres.genres_name) AS genres_name
FROM tmdb_movies
LEFT JOIN videos ON videos.videos_tmdb_id=tmdb_movies.tmdb_id
JOIN genres USING (tmdb_id)
WHERE 1=1
AND EXISTS( SELECT 1 FROM genres WHERE tmdb_movies.tmdb_id = genres.tmdb_id AND genres.genres_name = '$genres1' )
AND EXISTS( SELECT 1 FROM genres WHERE tmdb_movies.tmdb_id = genres.tmdb_id AND genres.genres_name = '$genres2' )
GROUP BY tmdb_movies.movie_title,tmdb_movies.tmdb_id
ORDER BY $sortby $order LIMIT 10 OFFSET $start");
// Then fire it up
$stmt->execute();
// Pick up the result as an array
$result = $stmt->fetchAll();
// Now you run through this array in many ways, for example
for($x=0, $n=count($result); $x < $n; $x++){
echo $result[$x]["movie_title"];
}
Screenshot of EXPLAIN
statement with this query
Here, the first query takes around 0.6
seconds to execute, and second one also takes around 0.6
seconds to execute.
Is there any way to merge both the SQL Query's to save execution time?
Any other way to increase SQL Query performance?
Here is the SQL Fiddle of second SQL Query.
My Indexes:
create index idxm on tmdb_movies(tmdb_id);
create index idxv on videos(videos_tmdb_id, videos_name, videos_key);
create index idxv on genres(genres_name, tmdb_id );