2013-08-13 6 views
-1

У меня есть база данных (MySQL), которая содержит информацию о фото, их рейтинге (люди могут голосовать) и комментарии.MySQL - какой запрос будет быстрее

CREATE TABLE IF NOT EXISTS `Photos` (
    `ID` INT NOT NULL AUTO_INCREMENT, 
    `Description` NVARCHAR(2000), 
    `Author` INT, 
    `Contest` INT, 
    `PhoneModel` NVARCHAR(200), 
    `PhotoThumbPath` NVARCHAR(2000), 
    `PhotoPath` NVARCHAR(2000), 
    `Date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    `State` INT DEFAULT 1, 
    FOREIGN KEY (`Author`) REFERENCES `Users`(`ID`), 
    FOREIGN KEY (`Contest`) REFERENCES `Contests`(`ID`), 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `PhotoComments` (
    `ID` INT NOT NULL AUTO_INCREMENT, 
    `Author` INT, 
    `Photo` INT, 
    `Comment` NVARCHAR(2000), 
    `Date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    `ReplyTo` INT, 
    FOREIGN KEY (`Author`) REFERENCES `Users`(`ID`), 
    FOREIGN KEY (`Photo`) REFERENCES `Contests`(`ID`), 
    FOREIGN KEY (`ReplyTo`) REFERENCES `PhotoComments`(`ID`), 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `PhotoComments` (
    `ID` INT NOT NULL AUTO_INCREMENT, 
    `Author` INT, 
    `Photo` INT, 
    `Comment` NVARCHAR(2000), 
    `Date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    `ReplyTo` INT, 
    FOREIGN KEY (`Author`) REFERENCES `Users`(`ID`), 
    FOREIGN KEY (`Photo`) REFERENCES `Contests`(`ID`), 
    FOREIGN KEY (`ReplyTo`) REFERENCES `PhotoComments`(`ID`), 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

Теперь я хочу задать базу данных для certaing фото, чтобы дать мне, сколько комментариев она имеет, сколько оценок и что средний рейтинг.

Какой один из этих способов будет быстрее: запрос с подзапросов 3:

SELECT P.PhotoPath, P.Date, P.PhoneModel, 
(SELECT COUNT(1) FROM PhotoComments C where C.Photo=P.ID) as CommentsCount, 
(SELECT COUNT(1) FROM PhotoRatings R where R.Photo=P.ID) as RatingsCount, 
(SELECT COALESCE(AVG(Rating), 0) FROM PhotoRatings R where R.Photo=P.ID) as RatingsAvg 
FROM Photos WHERE P.ID=$photoID 

или один большой запрос с 2 слева присоединяется:

SELECT P.PhotoPath, P.Date, P.PhoneModel, 
COUNT(DISTINCT C.ID) as CommentsCount, 
COUNT(DISTINCT R.ID) as RatingsCount, 
COALESCE(AVG(R.Rating), 0) as RatingsAvg 
FROM Photos P 
LEFT JOIN PhotoComments C ON C.Photo=P.ID 
LEFT JOIN PhotoRatings R ON R.Photo=P.ID 
WHERE P.ID=$photoID 
GROUP BY P.ID 

ответ

0

использование EXPLAIN на ваших querys и сравнить результат

Смежные вопросы