#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. Это сработало, спасибо.