Версия MySQL: 5.5.37-0ubuntu0.14.04.1
В настоящее время я пишу python script, который использует множество таблиц и запросов MySQL для получения результатов от инвертированного индекса, хранящегося в таблицах.
Я заметил, что выбор правильного типа Cursor в модуле python MySQLdb при выполнении запроса оказывает действительно большое влияние на производительность и задавался вопросом, может ли кто-нибудь объяснить или предоставить надежный ресурс, объясняющий, какой курсор использовать, когда.
В качестве примера, выполнение этого запроса 40 раз с SSCursor занимает 7 секунд:
SELECT Pages.PageID,
Pages.PageName,
Counter AS TermFreq,
Pages.Length,
(Counter / LOG(Length)) AS Weight
FROM Pages
INNER JOIN TermOccurrences ON TermOccurrences.PageID = Pages.PageID
INNER JOIN Terms ON TermOccurrences.TermID = Terms.TermID
WHERE TermName = %s
ORDER BY Weight DESC
LIMIT 20;
Выполнение того же запроса 40 раз с использованием курсора по умолчанию занимает 0,004 секунды.
Удаление вычисления веса (Counter/LOG (Length)) делает этот запрос быстрее выполняемым с использованием SSCursor.
Я использовал SSCursor, потому что он оказывал значительно более высокую производительность по ряду других запросов, а затем внезапно стал очень медленным для этого. Переход к стандартным курсором удивил меня, когда он выполнялся так быстро.
EDIT: Еще несколько примеров.
Выполнение следующего с курсором по умолчанию 40 раз занимает ~ 3 секунды:
SELECT COUNT(*)
FROM Pages
INNER JOIN TermOccurrences ON TermOccurrences.PageID = Pages.PageID
INNER JOIN Terms ON TermOccurrences.TermID = Terms.TermID
WHERE TermName = %s AND Counter > 2
Запуск его с помощью SSCursor займет примерно 0,002 секунды.