百万级数据库优化该怎样优化


   
  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,每当我查询

   
  SELECT * FROM  `pre_a_apid` WHERE  `typeid` =2 LIMIT 0 , 30
 

需要0.0006秒,如果倒序查询的话

   
  SELECT * FROM  `pre_a_apid` WHERE  `typeid` =2 ORDER BY  `pre_a_apid`.`aid` DESC LIMIT 0 , 30
 

就需要花费0.7秒,如何能够优化倒序查询的语句?大神们帮忙解决下这个办法

数据库设计

怪叔叔和怪阿姨 10 years, 4 months ago

要优化性能,你首先要知道,你的性能消耗在哪里?
第一个语句,由于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

Your Answer