需求:
有一个表t_mail_send_extend, 主键唯一索引是id,因为数据量达到了500多万,占用磁盘空间62GB,现在考虑使用mycat进行分表,分表之前需要将数据提前从mycql查询然后插入到mycat中的分表中,在查询过程中会遇到查询效率问题,越往后越慢
一般的查询:(通过控制limit来查询数据,这样越往后越慢) 若干秒过去了还没查到!
SELECT * FROM t_mail_send_extend WHERE id > 4000000 AND id <= 4500000 LIMIT 450000,100;
其他技巧1:(这种方式快是快,但是不方便要做两次查询)
1,先查询id(因为SELECT * 实在太慢了!) 284ms
SELECT id FROM t_mail_send_extend WHERE id > 4000000 AND id <= 4500000 LIMIT 450000,100;
2,再根据id查询所有数据 431ms
SELECT * FROM t_mail_send_extend WHERE id in (4450001,4450002, ... ..., 4450100);
其他技巧2:(最快的方式,只控制id大小来查询)334ms
SELECT * FROM t_mail_send_extend WHERE id > 5000000 LIMIT 100;
即使是500万之后速度依然很快,只需要334毫秒
但是有个问题这样很依赖id自增的特性,如果id不连续的情况下id查询条件计算错误可能会导致数据重复,但是id是主键唯一索引这样清空可以在插入的时候ignore