У меня есть структура таблицы, которую можно суммировать следующим образом:
pagegroup
* pagegroupid
* name
имеет 3600 строк
page
* pageid
* pagegroupid
* data
ссылки на страницу группы;
имеет 10000 рядов;
может содержать от 1 до 700 строк на группу страниц;
столбец данных имеет тип mediumtext, и в нем содержится 100–200 кбайт данных на строку
userdata
* userdataid
* pageid
* column1
* column2
* column9
страница ссылок;
имеет около 300 000 строк;
может иметь около 1-50 строк на странице
Приведенная выше структура довольно проста, проблема в том, что соединение пользовательских данных с группой страниц происходит очень медленно, даже если я проиндексировал все столбцы, которые должны быть проиндексированы. Время, необходимое для выполнения запроса для такого объединения (userdata inner_join page inner_join pagegroup) превышает 3 минуты. Это очень медленно, учитывая тот факт, что я вообще не выбираю столбец данных. Пример запроса, который занимает слишком много времени:
SELECT userdata.column1, pagegroup.name
FROM userdata
INNER JOIN page USING( pageid )
INNER JOIN pagegroup USING( pagegroupid )
Пожалуйста, помогите, объяснив, почему это занимает так много времени и что я могу сделать, чтобы сделать это быстрее.
Редактировать # 1
Объясните, возвращает следующий бред:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE userdata ALL pageid 372420
1 SIMPLE page eq_ref PRIMARY,pagegroupid PRIMARY 4 topsecret.userdata.pageid 1
1 SIMPLE pagegroup eq_ref PRIMARY PRIMARY 4 topsecret.page.pagegroupid 1
Редактировать # 2
SELECT
u.field2, p.pageid
FROM
userdata u
INNER JOIN page p ON u.pageid = p.pageid;
/*
0.07 sec execution, 6.05 sec fecth
*/
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE u ALL pageid 372420
1 SIMPLE p eq_ref PRIMARY PRIMARY 4 topsecret.u.pageid 1 Using index
SELECT
p.pageid, g.pagegroupid
FROM
page p
INNER JOIN pagegroup g ON p.pagegroupid = g.pagegroupid;
/*
9.37 sec execution, 60.0 sec fetch
*/
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE g index PRIMARY PRIMARY 4 3646 Using index
1 SIMPLE p ref pagegroupid pagegroupid 5 topsecret.g.pagegroupid 3 Using where
Мораль истории
Храните средние / длинные текстовые столбцы в отдельной таблице, если вы столкнулись с проблемами производительности, такими как эта.