Почему mysql игнорирует ИНДЕКС при запросе СОЕДИНЕНИЯ

#mysql

Вопрос:

У меня есть 2 таблицы postsTable и groupsTable. Я опубликовал структуру и индексы обоих ниже.

Мой вопрос в том, что в приведенном ниже запросе mysql должен использовать «индекс nCode» groupsTable. Но он полностью игнорирует это, хотя и перечисляет его как возможный индекс.

Индекс постстабильности следует, как и ожидалось.

Что я могу сделать здесь, чтобы исправить это? Спасибо

 create table postsTable  (pid int(18) auto_increment not null primary key, userID int(10), stat int(10), mainID int(10), title varchar(256), INDEX( userID, stat, mainID ) );  create index postPStat on postsTable (stat, mainID);   create table groupsTable (cid int(10) auto_increment not null primary key, nCode int(10), cStat (char2) default 'y', aCode varchar(256), groupName varchar(256), INDEX(nCode, cStat, aCode ) );  

Вопрос заключается в следующем:

 select p.pid, p.title, t.groupName  from postsTable as p left join groupsTable as t  on p.stat = t.nCode where  p.stat = t.nCode  and p.mainID=0  and t.cStat='y'  group by p.pid   

Объясните, это:

 2 in array Array (  [0] =gt; Array  (  [id] =gt; 1  [select_type] =gt; SIMPLE  [table] =gt; t  [partitions] =gt;   [type] =gt; system  [possible_keys] =gt; nCode  [key] =gt;   [key_len] =gt;   [ref] =gt;   [rows] =gt; 1  [filtered] =gt; 100.00  [Extra] =gt; Using filesort  )   [1] =gt; Array  (  [id] =gt; 1  [select_type] =gt; SIMPLE  [table] =gt; p  [partitions] =gt;   [type] =gt; ref  [possible_keys] =gt; PRIMARY,id,id_2,postPStat  [key] =gt; postPStat  [key_len] =gt; 16  [ref] =gt; const,const  [rows] =gt; 1  [filtered] =gt; 100.00  [Extra] =gt; Using index condition  )  )  

Ответ №1:

Ваш текущий запрос , похоже, не нужен GROUP BY , а также логика соединения, скорее всего, имеет проблемы. Рассмотрим эту версию:

 SELECT p.pid, p.title, t.groupName  FROM postsTable p LEFT JOIN groupsTable t   ON p.stat = t.nCode AND  t.cStat = 'y' WHERE p.mainID = 0;  

Индекс, который вы хотите здесь, находится на groupsTable :

 CREATE INDEX idx ON groupsTable(nCode, cStat, groupName);  

Обратите внимание , что этот индекс отличается от (nCode, cStat, aCode) того, который у вас есть в настоящее время. Ваш индекс не охватывает предложение select и, следовательно, не охватывает весь запрос.

Комментарии:

1. Это сработало, спасибо.