mysql中创建了一张双主键的表 插入数据90W条 SELECT COUNT(*) FROM TyumonDetail 竟然耗时6.7S 请各位高手指定一二。表结构如下
CREATE TABLE `TyumonDetail` (
  `AtNo` int(4) unsigned NOT NULL,
  `DetailNo` int(4) unsigned NOT NULL,
  `Kubun` char(1) NOT NULL,
  `Azukari` char(1) NOT NULL,
  `SyohinCd` char(13) NOT NULL,
  `SyohinNm` varchar(40) NOT NULL,
  `SokoCd` varchar(4) NOT NULL,
  `Ttnnyr` decimal(16,3) NOT NULL,
  `Hako` decimal(16,3) NOT NULL,
  `Ko` decimal(16,3) NOT NULL,
  `Tani` varchar(4) NOT NULL,
  `Tanka0` decimal(16,2) NOT NULL,
  `Tanka1` decimal(16,2) NOT NULL,
  `KinGaku0` decimal(16,0) NOT NULL,
  `KinGaku1` decimal(16,0) NOT NULL,
  `SyoHizei` decimal(16,0) NOT NULL,
  `TtnnyrSKta` char(1) NOT NULL,
  `HakoSKta` char(1) NOT NULL,
  `KoSKta` char(1) NOT NULL,
  `TankaSKta` char(1) NOT NULL,
  `UZeiKb` char(1) NOT NULL,
  `UZeikomi` char(1) NOT NULL,
  `BiKo` varchar(40) NOT NULL,
  `DelFlag` char(1) NOT NULL,
  PRIMARY KEY (`AtNo`,`DetailNo`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

解决方案 »

  1.   

    贴出你的EXPLAIN SELECT结果和SHOW INDEX FROM
      

  2.   


    你的表是不是innodb表呢?如果是的话,有这种可能,因为你没有建主键。如果是myisam的话,很快就出来了count(*)的结果。
      

  3.   

    不好意思,没有看全你的create table语句,果然是innodb存储过程的表啊。还有,你试试用select count(1) from  TyumonDetail ;  试试看啊,因为你的表的字段太多了,我担心count(*)会对你的统计有影响的,用count(1)可能会好一点的。
      

  4.   

    建议所有的表,都放一个和业务无关,只代表这行位置的ID字段做PK,其他业务上的,一律Unique。以前碰到过类似问题。1万×10万行两表join,从中检索出符合条件的几百条数据,索引什么也没问题,竟然需要几分钟。后来把其中一张加了ID做PK,原来的两个字段做UK,零点几秒就出来了。貌似和索引工作原理有关。因为没有唯一定位字段,没法和数据物理位置直接联系起来。你count(*)的问题,没想明白。
      

  5.   


    你的问题,我也碰到过,确实是这样的,count(*)这个一般我用的很少,都是直接用count(1)或者count(主键字段)来着。
      

  6.   

    可以给字段AtNo`或`DetailNo`加一个普通索引, 好像count(*)走二级索引速度要快一些,您试一试!!
      

  7.   

    先别调整任何索引,先
    ANALYZE  TABLE  TyumonDetail; OPTIMIZE  TABLE  TyumonDetail;
    然后再试试,会快么?