我有一个表结构,可以总结如下:
pagegroup
* pagegroupid
* name
有 3600 行
page
* pageid
* pagegroupid
* data
参考页组;有 10000 行;每个页面组可以有 1-700 行之间的任何内容;数据列的类型为 mediumtext,该列每行包含 100k - 200kbytes 数据
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
故事的道德启示
如果遇到诸如此类的性能问题,请将中/长文本列保留在单独的表中。