数据库设计-百万级数据库优化该怎样优化

发布于 2017-02-24 17:27:33 字数 833 浏览 1380 评论 1

CREATE TABLE IF NOT EXISTS `pre_a_apid` (
`aid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`typeid` smallint(5) unsigned NOT NULL DEFAULT '0',
`body` mediumtext,
`uid` smallint(10) unsigned NOT NULL DEFAULT '1',
`time` int(10) unsigned NOT NULL,
`hash` varchar(250) NOT NULL DEFAULT '',
`number1` varchar(250) NOT NULL DEFAULT '',
`size123` varchar(250) NOT NULL DEFAULT '',
`yun` varchar(250) NOT NULL DEFAULT '',
`downshu` varchar(250) NOT NULL DEFAULT '',
`gb` varchar(250) NOT NULL DEFAULT '',
`shen` int(2) NOT NULL,
`uname` varchar(100) NOT NULL,
`shuid` int(5) NOT NULL,
UNIQUE KEY `aid` (`aid`),
FULLTEXT KEY `body` (`body`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2546471 ;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

归属感 2017-04-10 11:44:32

要优化性能,你首先要知道,你的性能消耗在哪里?
第一个语句,由于aid是你的唯一索引,在这个索引上默认是升序的,当你查询typeid=2时,你只需要顺序查询30条typeid=2的记录。然后就返回。
第二条语句,由于你需要30条typeid=2的记录,但是你使用了order by和aid的排序是相反的,索引需要全表扫描出所有typeid=2(第一个语句只需要扫描出30条),然后排序(倒排)了。

性能消耗在:全表扫描+排序。

你要优化这个查询语句,你就有两个思路可以考虑:减少全表扫描,避免排序。
我不知道你的业务场景是不是还有其他的:如果只是这个,可以再aid上建立倒序索引,例如create index idx_test_t_id_DESC on pre_a_apid(aid);等。这样建立索引的同时减少了排序。

第二,就是想办法做成覆盖索引。例如:create index idx_test_t_id_DESC on pre_a_apid(aid,typeid);

两百万条数据,不多,索引和一些小技巧就可以hold住。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文