![](/img/trans.png)
[英]Simple query is slow in laravel (with paginate) but very fast in phpmyadmin
[英]Query VERY slow (>30s) in php, but fast when running the query in phpmyadmin
我認為自己是mysql / php的初學者,當您看到我的代碼:D時不要感到震驚。 我用mysql查詢制作了一個php函數,當我調用該函數時,該查詢會花費很長時間(大部分時間)。 他們很少會很快執行。 在PHPmyadmin中,此php函數中的單個查詢運行迅速且沒有錯誤。
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);
}
-- 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 */;
使用這樣的Join查詢,我得到相同的結果及其工作:)仍然不知道為什么嵌套查詢要花費40-50秒。 感謝用戶Dibakar Paul的幫助!
$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'";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.