Каков самый быстрый способ выбора по списку строк в базе данных sqlite?

У меня есть база данных с примерно следующей структурой:

table1 (name) -

где - <означает 1 для многих отношений. Мне нужно сделать, чтобы каждая строка в данном списке находила связанную запись из таблицы3 с максимальным значением оценки. То, как я делаю это сейчас, довольно медленное, и я удивляюсь, что его можно ускорить.

Как я это делаю:

SELECT k.score,k.yaw,k.pitch,k.roll,k.kp_number,k.ke_number,k.points,k.elems --various fields of third table
FROM File 
JOIN FaceDetection AS d ON d.f_id=File.file_id --joining second table
JOIN FaceKey AS k ON k.face_det=d.fd_id --joining third table
WHERE name=:fld 
ORDER BY k.score DESC

Я открываю транзакцию, готовлю запрос с указанным выше текстом, а в цикле извлекают записи, которые меня интересуют из базы данных, а затем совершают транзакцию. Что лучше, быстрее?

1 ответ

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

Проверьте вывод EXPLAIN QUERY PLAN, чтобы узнать, сканирует ли этот запрос таблицы или использует индексы.

Вы не возвращаете значения из любой таблицы, кроме FaceKey, поэтому вам действительно не нужно делать соединение. Однако переписывание запроса, как показано ниже, может или не поможет:

SELECT score,
 yaw,
 pitch,
 roll,
 kp_number,
 ke_number,
 points,
 elems
FROM FaceKey
WHERE face_det IN (SELECT fd_id
 FROM FaceDetection
 WHERE f_id IN (SELECT file_id
 FROM File
 WHERE name = :fld))
ORDER BY score DESC

licensed under cc by-sa 3.0 with attribution.