MySQL оптимизация (объяснить) с помощью dbforge

Я нахожусь в процессе рассмотрения моих запросов с помощью dbForge, чтобы убедиться, что они являются оптимальными или оптимальными, насколько это возможно. У меня есть следующее, которое я использую практически для всего, и результаты меня пугают, пока я правильно их читаю.

Основная суть установки db - учетные записи, компьютеры, пользователи (таблицы, которые ссылаются на пользователей). Любое количество компьютеров связано с учетной записью, при этом любое количество пользователей связано с каждым компьютером, а все другие таблицы связаны с пользователем.

Я использую следующее, чтобы возвращать результаты только с "активных" компьютеров. Предоставив:account_id и:account_licenses я могу сделать это. Например, 1 и 3 будут возвращать результаты только с первых 3 компьютеров (отсортированных по их идентификатору) для учетной записи 1. Надеюсь, это имеет смысл.

SELECT *
FROM
( SELECT account_id, computer_id
    FROM computers
    WHERE account_id = :account_id
    ORDER BY computer_id ASC LIMIT 0, :account_licenses
) as c
INNER JOIN users
    on users.computer_id = c.computer_id

...further joins which act on user_id

результаты от dbforge, которые меня пугают:

table        id     select type    type    possible keys    key    key len    ref    rows    extra
<derived2>  1   PRIMARY ALL                 5   
computers   2   DERIVED ALL unique_filter   unique_filter   4       14  Using filesort
users   1   PRIMARY ref unique_filter   unique_filter   4   c.computer_id   1

Что меня пугает, так это то, что таблица компьютеров сканирует все строки в своей таблице (14). 14 - это общее количество строк в этой конкретной таблице в то время (я просто тестирую так мало данных), но когда это растет, я, конечно, не хочу сканировать всю таблицу каждый раз.

Это то, что на самом деле происходит, или я читаю это неправильно?

РЕДАКТИРОВАТЬ:

Извините, я должен был отметить индексы.... account.account_id, computers.account_id, computers.computer_id, users.computer_id, users.user_id

2 ответа

Может показаться, что я указываю на очевидное, но вы не упомянули индексы в тексте своего вопроса.

Запрос может сканировать всю таблицу компьютеров, если у вас нет индекса для account_id. Некоторые процессы SQL могут сканировать всю таблицу, если в ней всего несколько строк, а 14 - это то, что я бы назвал "не много строк".

Я думаю, что лучшее, что вы можете сделать, это проверить индексы и добавить много записей (скажем, 50-100) в таблицу, а затем протестировать ее на эффективность.

Эта проблема не связана с dbForge Studio. Тема — оптимизация сервера MySQL.

Другие вопросы по тегам