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.