Query VERY slow (>30s) in php, but fast when running the query in phpmyadmin

流过昼夜 提交于 2020-01-07 03:44:08

问题


I would consider myself as beginner in mysql/php, dont be to shocked when you see my code :D . I made a php function with mysql queries which take very long (most of the time) when I call the function. They rarely will be executed fast. In PHPmyadmin the single queries in this php function run fast and without errors.

Slow Function

       public function getAllMusicDataNew($playlist_name, $mysqli) {

// einzeln alle titel / alle künstler / alle alben auflisten als array 

    $sql1 = "Select distinct title, artist, album from songs where id not in(Select distinct id from songs where id 
    IN(Select id from songs where title IN(Select title from songs where id 
    IN(Select song_id from playlist where playlist_id IN (Select playlist_id from playlists where name = '$playlist_name')))))";
    $getTitles = $mysqli->query($sql1);

    $sql2 = "Select distinct artist from songs where id not in(Select distinct id from songs where id IN
    (Select id from songs where artist IN(Select artist from songs where id IN(Select song_id from playlist
    where playlist_id IN (Select playlist_id from playlists where name = '$playlist_name')))))";
    $getArtists = $mysqli->query($sql2);

    $sql3 = "Select distinct album, artist from songs where id not in( Select distinct id from songs where id IN(Select id from songs where album IN( Select album from songs where id IN( Select song_id from playlist
    where playlist_id IN ( Select playlist_id from playlists where name = '$playlist_name'))and album <> '')))";
    $getAlbums = $mysqli->query($sql3);

    $sql4 = "Select distinct title, artist, album from songs where id in(Select distinct id from songs where id 
    IN(Select id from songs where title IN(Select title from songs where id 
    IN(Select song_id from playlist where playlist_id IN (Select playlist_id from playlists where name = '$playlist_name')))))";
    $getTitles_added = $mysqli->query($sql4);

    $sql5 = "Select distinct artist from songs where id  in(Select distinct id from songs where id IN
    (Select id from songs where artist IN(Select artist from songs where id IN(Select song_id from playlist
    where playlist_id IN (Select playlist_id from playlists where name = '$playlist_name')))))";
    $getArtists_added = $mysqli->query($sql5);

    $sql6 = "Select distinct album, artist from songs where id in( Select distinct id from songs where id IN(Select id from songs where album IN( Select album from songs where id IN( Select song_id from playlist
    where playlist_id IN ( Select playlist_id from playlists where name = '$playlist_name'))and album <> '')))";
    $getAlbums_added = $mysqli->query($sql6);


while ($row = $getTitles->fetch_assoc()) {

      $results_array1[] = $row;


    }

        while ($row = $getArtists->fetch_assoc()) {

      $results_array2[] = $row;


    }

        while ($row = $getAlbums->fetch_assoc()) {

      $results_array3[] = $row;


    }


    if(mysqli_num_rows($getTitles_added)!=0) {


        while ($row = $getTitles_added->fetch_assoc()) {

      $results_array4[] = $row;


    }


        while ($row = $getArtists_added->fetch_assoc()) {

      $results_array5[] = $row;


    }
    while ($row = $getAlbums_added->fetch_assoc()) {

      $results_array6[] = $row;


    }

    } else {


      $results_array4[] = "empty";

      $results_array5[] = "empty";

      $results_array6[] = "empty";


     }
//  print_r($titles);
        $titles["titles"] = $results_array1;
    $artists["artists"] = $results_array2;
    $albums["albums"] = $results_array3;
    $titles_added["titles_added"] = $results_array4;
    $artists_added["artists_added"] = $results_array5;
    $albums_added["albums_added"] = $results_array6;


        //  printf($array_merge($results_array1, $results_array2,      $results_array3));
            return array_merge($titles, $artists, $albums, $titles_added, $artists_added, $albums_added);


}

Database

-- phpMyAdmin SQL Dump
-- version 4.2.12deb2+deb8u1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Erstellungszeit: 10. Aug 2016 um 17:04
-- Server Version: 5.5.44-0+deb8u1
-- PHP-Version: 5.6.23-0+deb8u1

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Datenbank: `musicbox2`
--

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `playlist`
--

CREATE TABLE IF NOT EXISTS `playlist` (
  `playlist_id` int(11) NOT NULL,
`track_id` int(11) NOT NULL,
  `song_id` int(11) NOT NULL,
  `votes` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1189 DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `playlists`
--

CREATE TABLE IF NOT EXISTS `playlists` (
`playlist_id` int(11) NOT NULL,
  `name` varchar(60) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `songs`
--

CREATE TABLE IF NOT EXISTS `songs` (
`id` int(11) NOT NULL,
  `path` varchar(100) NOT NULL,
  `artist` varchar(60) NOT NULL,
  `title` varchar(60) NOT NULL,
  `album` varchar(50) NOT NULL,
  `added_at` datetime NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=4803 DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `users`
--

CREATE TABLE IF NOT EXISTS `users` (
`userID` int(11) NOT NULL,
  `voices` int(11) NOT NULL,
  `pass` varchar(18) NOT NULL,
  `created_at` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Indizes der exportierten Tabellen
--

--
-- Indizes für die Tabelle `playlist`
--
ALTER TABLE `playlist`
 ADD PRIMARY KEY (`track_id`), ADD KEY `song_id` (`song_id`), ADD KEY `playlist_id` (`playlist_id`);

--
-- Indizes für die Tabelle `playlists`
--
ALTER TABLE `playlists`
 ADD PRIMARY KEY (`playlist_id`);

--
-- Indizes für die Tabelle `songs`
--
ALTER TABLE `songs`
 ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `title` (`title`,`artist`,`album`);

--
-- Indizes für die Tabelle `users`
--
ALTER TABLE `users`
 ADD PRIMARY KEY (`userID`);

--
-- AUTO_INCREMENT für exportierte Tabellen
--

--
-- AUTO_INCREMENT für Tabelle `playlist`
--
ALTER TABLE `playlist`
MODIFY `track_id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1189;
--
-- AUTO_INCREMENT für Tabelle `playlists`
--
ALTER TABLE `playlists`
MODIFY `playlist_id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=13;
--
-- AUTO_INCREMENT für Tabelle `songs`
--
ALTER TABLE `songs`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=4803;
--
-- AUTO_INCREMENT für Tabelle `users`
--
ALTER TABLE `users`
MODIFY `userID` int(11) NOT NULL AUTO_INCREMENT;
--
-- Constraints der exportierten Tabellen
--

--
-- Constraints der Tabelle `playlist`
--
ALTER TABLE `playlist`
ADD CONSTRAINT `playlist_ibfk_1` FOREIGN KEY (`song_id`) REFERENCES `songs` (`id`) ON DELETE CASCADE,
ADD CONSTRAINT `playlist_ibfk_2` FOREIGN KEY (`playlist_id`) REFERENCES `playlists` (`playlist_id`) ON DELETE CASCADE;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Sql Process list


回答1:


With a Join query like this I have the same results and its working :) still dunno why the nested queries took up to 40-50seconds. Thanks to user Dibakar Paul who helped me!

$sql1 = "Select distinct title, artist, album 
from songs where id not in(Select distinct song.id
from songs song inner join playlist playlist 
on playlist.song_id=song.id
inner join playlists playlists 
on playlists.playlist_id=playlist.playlist_id
and playlists.name = '$playlist_name')";

$sql2 = "Select distinct song.title, song.artist, song.album
from songs song inner join playlist playlist 
on playlist.song_id=song.id
inner join playlists playlists 
on playlists.playlist_id=playlist.playlist_id
and playlists.name = '$playlist_name'";


来源:https://stackoverflow.com/questions/38877348/query-very-slow-30s-in-php-but-fast-when-running-the-query-in-phpmyadmin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!