省略一切闲言碎语直接上方案。
第一步:建一个表,命名为 test,一个id字段,再加一个content内容字段吧;
第二步:往test里塞1000万条数据,当然你也可以塞10亿条,哈哈哈哈哈;
第三步:建一个表:命名为 table_delete_id_aggregate,两个字段,三个字段,id、did(删除的id),tableName(删除数据的表名称);
第四步:某个表(假设A表)删除数据时需要往table_delete_id_aggregate表中记录被删除id和数据表名;
第五步:某个表(假设A表)添加数据时,需要从table_delete_id_aggregate中随意获得一个已删除的id,用来填补已经缺失的id,添加成功后从table_delete_id_aggregate中删除这个id,目的是为了减少table_delete_id_aggregate的数据量以及让A表的id变得更连续;
第六步:某个表(假设A表)查询时,需要先查出这个查询条件的最小id,得到这个id后,需要用到一个方法,用来向找到数据之间存在多少断点,譬如已经删除的id值为1、2、3、4、5、6、7、8、9、10、30、300、1000,最小id是1,分页需要往后取10条数据,需要遍历一下这个已删除的数组,找到满足取10条的最大id值,然后交给查询语句between minid and maxid查出所需的10条数据。然后limit就不需要了。
至此,10亿+的mysql表,就再也没有count(*)、limit查询语句性能差效率低问题了。当然,这种方法只适合在分页时使用,不过别的场景应该也没有多大问题哈。
唉!又免费为社会广大人民做贡献了,希望数据库公司不会因此而倒闭。