Любой ресурс, где объясняется, как оценивать сложность SQL-запросов, будет высоко оценен.
Если вы имеете в виду, как я могу оценить, насколько сложным должен быть запрос для выполнения задачи, я думаю, что вопрос не по теме для этого сайта, пожалуйста, прочитайте stackoverflow.com/help/on-topic , чтобы узнать, что вы можете спросить и прочитать en.wikipedia.org/wiki/…. в качестве основы для теории вычислительной сложности
Я голосую за закрытие этого вопроса, потому что вопрос, похоже, касается теории сложности вычислений.
Ознакомьтесь с официальной документацией MySQL по плану выполнения запросов: https://dev.mysql.com/doc/refman/5.7/en/execution-plan-information.html
Вы можете использовать команду EXPLAIN, чтобы получить больше информации о вашем запросе.
(Я предполагаю, что под «сложностью» вы подразумеваете «медленность»?) Несколько советов:
GROUP BY
и ORDER BY
-- когда присутствуют оба, но разные: обычно требуется два вида.SELECT
используется только один индекс.OR
почти всегда неэффективен. Переключение на UNION
позволяет эффективно использовать несколько индексов.UNION ALL
, с некоторыми ограничениями, более эффективен, чем UNION DISTINCT
(из-за прохода дедупликации)WHERE
, GROUP BY
и ORDER BY
обрабатываются одним индексом, можно эффективно обрабатывать LIMIT
. (Иначе он должен собрать весь материал, отсортировать его, и только тогда он сможет отклеить несколько рядов.)LIMIT
, лучше вывернуть запрос наизнанку. То есть начните с подзапроса, который находит несколько ids
, которые вам нужны, а затем возвращается к той же таблице и другим таблицам, чтобы получить остальные нужные столбцы.AUTO_INCREMENT
снижает производительность; помогает в других.EXPLAIN (или EXPLAIN FORMAT=JSON) говорит вам, что происходит сейчас; он не может сказать вам, как переписать запрос или какой лучший индекс добавить.
Дополнительные советы по индексированию: http://mysql.rjweb.org/doc.php/index_cookbook_mysql В этой ссылке см. «Число обработчиков», чтобы узнать, как измерить сложность конкретных запросов. Я использую его для сравнения формулировок запросов и т. д., даже не заполняя большую таблицу, чтобы получить удобные тайминги.
Дайте мне кучу запросов; Я укажу на сложности, если таковые имеются, в каждом.
Большинство, если не все СУБД, позволяют вам получить плановую информацию о запросе. Хотя простой на вид sql может привести к сложному плану и наоборот, тем не менее, он может быть хорошей отправной точкой.