MySQL MyISAM表性能……痛苦,痛苦地缓慢
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL MyISAM表性能……痛苦,痛苦地缓慢,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3300字,纯文字阅读大概需要5分钟。
内容图文
![MySQL MyISAM表性能……痛苦,痛苦地缓慢](/upload/InfoBanner/zyjiaocheng/900/fb701facf0fd41b1aaa7b86017a46085.jpg)
我有一个表结构,可以总结如下:
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到页面组的连接非常非常慢,即使我已经索引了应该被索引的所有列.运行此类连接的查询所需的时间(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
故事的道德启示
如果遇到诸如此类的性能问题,请将中/长文本列保留在单独的表中.
解决方法:
userdata表中columnX的数据类型和用途是什么?应该注意的是,任何文本数据类型(即排除char,varchar)都会强制在磁盘上创建任何临时表.既然你在没有条件,分组或排序的情况下进行直接连接,它可能不需要任何临时表,除了聚合最终结果.
如果您向我们展示如何创建索引,我认为这也将非常有用.需要记住的一点是,虽然InnoDB将表的主键连接到每个索引,但MyISAM却没有.这意味着如果您索引列名并使用LIKE搜索它,但仍希望获取页组的ID;然后查询仍然需要访问表来获取id,而不是能够从索引中检索它.
这意味着,在您的情况下,如果我理解您对apphacker的正确评论,那就是获取每个用户页面组的名称.查询优化器希望使用索引进行连接,但是对于每个结果,它还需要访问该表以检索页组名称.如果名称上的数据类型不大于中等varchar,即没有文本,则还可以创建一个索引(id,name),使索引能够直接从索引中获取名称.
作为最后的尝试,您指出如果mediumtext不在页表中,整个查询可能会更快.
>此列从我正在运行的查询中排除?
>您还可以尝试将页面数据与页面“配置”分开,即它属于哪个组.那你可能会有类似的东西:
>页面
> pageId
> pageGroupId
> PageData
> pageId
>数据
这有望使您能够更快地加入,因为Pages中的列没有占用太多空间.然后,当您需要显示某个页面时,您将使用pageId-column上的PageData表连接以获取显示特定页面所需的数据.
内容总结
以上是互联网集市为您收集整理的MySQL MyISAM表性能……痛苦,痛苦地缓慢全部内容,希望文章能够帮你解决MySQL MyISAM表性能……痛苦,痛苦地缓慢所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。