where条件出来的数据几乎是扫描全表了,有什么方案解决

有这样一个表

CREATE TABLE `block`  (
  `ID` int(11) NOT NULL,
  `BlockID` int(11) NOT NULL,
  `Status` tinyint(4) NOT NULL,
  PRIMARY KEY (`ID`),
  INDEX `BlockID`(`BlockID`) USING BTREE,
  INDEX `Status`(`Status`) USING BTREE
) ENGINE = MyISAM;

这个表大概有1千万的数据,其中,status就只有2个状态,要么等于0 ,要么等于1,来表示开关状态。
当我,select count(*) from block where status=1 的时候,因为这1千万数据,90%以上的都是status=1,导致在实际查询过程中,和全表扫描也没差了。敢问各路大神有没有什么好的解决办法。

小弟只是觉得分表是没必要的,因为这个表本来就是一体的。而且这种情况在我们库里面几百张表都存在,如果要水平去分,以后维护太难。

阅读 4k
5 个回答

如果我遇到这种问题,大概会用两个方法,1,如果这是一个经常要用到的查询,直接建一个表维护这些数据,每次在增加或者修改状态的业务中去维护这个记录.2,如果主要用于分析,统计只是其中一部分而且数据比较静态,上千万的数据量,我就换clickhouse+sqlproxy

区分度不够高的字段,其实全表扫描会比用索引快。

新手上路,请多包涵

建个位图索引会好的多吧

告诉你一个方法,select count() from block 比 select count() from block where status=1 要快
所以既然你90%的是1,可以直接查总数减去 select count(*) from block where status=0 的数,这样速度会快很多。

只有status=1一个条件吗,不可以再多几个条件? 如果是返回前端,分页返回数据不行吗? 不知道具体做什么功能...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题