Использование индекса при соединении - PullRequest
0 голосов
/ 17 июля 2010

Использование EXPLAIN для запроса ниже показывает

SELECT cha.cid AS cid,
       cha.data AS dl
FROM cha, c_users
WHERE uid = 808
AND cha.cid = c_users.cid;
  1. выполняет полное сканирование cha таблицы
  2. использует многостолбцовый индекс (cid, uid) от c_users.

Почему он не использует индекс первичного ключа из cha, а выполняет полное сканирование таблицы. Есть ли лучший способ оптимизировать запрос / таблицу.

Edit: cha.cid - мой первичный ключ. Добавлено после комментария ниже.

Ответы [ 4 ]

1 голос
/ 17 июля 2010

В обычном BTREE и индексе (cid, uid) сканирование потребуется, если вы не укажете cid и будете искать только uid. Индекс на (uid, cid) (обратите внимание на порядок) может / может помочь.

Это ни в коем случае не является гарантией того, что оно будет использоваться, MySQL может предположить, что полное сканирование может быть быстрее (непрерывное чтение), если определенный индекс / соединение, скорее всего, потребует использования определенного большого процента индекса, и другие причины. Вы можете проверить с помощью FORCE INDEX, является ли использование ключа по сравнению со сканированием более быстрым или нет (отключите кэш запросов на тестовом сервере перед тестированием).

0 голосов
/ 17 июля 2010

Поскольку cha не имеет индекса покрытия , доступного для этого запроса, он должен в любом случае обращаться к страницам данных, чтобы получить некоторые данные, которые ему нужны.Основываясь на статистике таблицы, оптимизатор решил, что время IO, сначала сканирующее индекс, а затем переходящее к страницам данных, похоже на худшее, чем простое сканирование таблицы.

0 голосов
/ 17 июля 2010

Создание индекса для столбца uid.

Когда вы задаете вопрос о производительности, вывод операторов EXPLAIN и CREATE TABLE значительно упрощает работу помощников.Пожалуйста, добавьте их в следующий раз.

0 голосов
/ 17 июля 2010

Не был бы ...

SELECT cha.cid AS cid,
       cha.data AS dl
    FROM cha INNER JOIN c_users ON cha.cid = c_users.cid
    WHERE uid = 808;

быть более идиоматичным?

(отредактировано для учета комментариев Книттля).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...