百万级数据库优化该怎样优化
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 ;
这是我设计的数据库,总数量为2546471,每当我查询
需要0.0006秒,如果倒序查询的话
就需要花费0.7秒,如何能够优化倒序查询的语句?大神们帮忙解决下这个办法
怪叔叔和怪阿姨
10 years, 4 months ago
Answers
要优化性能,你首先要知道,你的性能消耗在哪里?
第一个语句,由于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住。
Ming,
answered 10 years, 3 months ago