Не могу понять, какой индекс мне нужен для этого запроса MySQL - пожалуйста, помогите? - PullRequest
0 голосов
/ 09 ноября 2010

ОК, я не могу понять, какой индекс у меня должен быть в "TBL_PHOTOS", чтобы этот запрос выполнялся быстро. В настоящее время занимает около 0,8 секунд с 50000 строк в PH, 50000 в PL, 300 в R1 и 100 в R2.

Если я удаляю предложение ORDER BY, запрос выполняется быстро и занимает <0,05 секунды. </p>

Кстати, в MySQL есть следующее:

SELECT  PH.tTaken, PH.nPhotoPK, PH.sFilename

FROM TBL_PHOTOS PH
    LEFT JOIN TBL_PHOTO_LINKS PL ON PH.nPhotoPK = PL.nPhotoFK

    LEFT JOIN TBL_RACES1 R1 ON R1.nRacePK = PH.nRace1FK
    LEFT JOIN TBL_RACES2 R2 ON R2.nRacePK = PH.nRace2FK


WHERE PL.nPhotoLinkPK IS NULL

ORDER BY PH.tAdded DESC

LIMIT 0,100

Намерение состоит в том, чтобы вернуть 100 последних загруженных фотографий, которые еще ни с чем не связаны. TBL_RACES1 и TBL_RACES2 - это две разные таблицы по уважительной причине, поэтому я не могу это изменить. Фотография всегда будет принадлежать одному объекту из R1 или R2, но не обоим одновременно.

Извините, если по какой-то причине это плохой SQL, это не моя сильная сторона. Я даже не уверен, какая информация вам понадобится, чтобы помочь мне, поэтому, если я оставил что-то важное, просто спросите.

У меня уже есть несколько индексов для таблицы, но в инструкции объяснения я получаю

possible_keys: (Null)
key: (null)
ref: (null)

Спасибо!

1 Ответ

0 голосов
/ 09 ноября 2010

Если удаление ORDER BY заставляет запрос выполняться намного быстрее, проблема заключается в сортировке.Вероятно, вы извлекаете тысячи строк, а затем берете первые 100. Перестройте запрос, чтобы сначала извлечь самые последние 100 фотографий, а затем объединить их с другими таблицами.Примерно так (не проверено):

SELECT  tTaken, nPhotoPK, sFilename
FROM 
    (select * from TBL_PHOTOS order by tAdded DESC LIMIT 0,100) PH
    LEFT JOIN TBL_PHOTO_LINKS PL ON PH.nPhotoPK = PL.nPhotoFK
    LEFT JOIN TBL_RACES1 R1 ON R1.nRacePK = PH.nRace1FK
    LEFT JOIN TBL_RACES2 R2 ON R2.nRacePK = PH.nRace2FK
WHERE PL.nPhotoLinkPK IS NULL

Я не знаком с синтаксисом MySQL, чтобы быть уверенным, что это способ выразить его в MySQL, но это должно дать вам общее представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...