远方

远方的山水虽遥远,却在心中永驻,像一首美妙的乐曲,让人心醉神迷。

MySQL百万级数据查询

随想 1 评 241 度

系统目前用的数据库是MySQL,现在有一个表的数据量是接近700万,所以后台运营查看数据时,因为数据量大的原因,极其耗时.

目前的写法就是

select * from t_table where a=xxx limit 100,10

这种写法在数据量不大的时候当然没什么问题,但是数据量一大,limit的问题就显现出来了,越往后面,越接近全表扫描.耗时几十秒,几乎是不可忍受的事情.

因为是分页查询,所以酶促查询都会回去总条数,select count(1) 同样会很慢,也需要几十秒的时间.

这样一来,这里的查询方式必须改变了.

需要改变两个地方

1.获取总条数的sql

2.获取分页数据的sql

对于第一条,我们的数据表的id是自增的,所以一般情况下也不会删除数据,所以问题不大,直接获取最后一条数据的id,id是多少那么数据的条数就是多少.

解决方案如下

select id from t_table order by id desc limit 1;

当然我觉得其实有别的方案,比如创建一个统计表,专门存当天表的数据总量,但相对的,当有查询条件的时候,这个也是不管用的,还有一个我的独家秘诀,使用explain语句

explain select count(1) from t_table where a=xxx 

explain语句中会返回rows字段,表示MySQL扫描的多少行数据,一般情况下这条数据能大概得表示出数据数量,但是因为explain的rows字段并不是精确的行数,所以这里只是一个估算的值,但是在几百万的数据量上面,我认为这个误差是可以接受的,如果id字段不是自增的,或者是UUId或者雪花ID这种.我觉得也可以使用这种方案.

对于第二条的优化方案,采用子查询是一种比较好的方案,先查出Id,再根据Id查出对应的数据.

select * from t_table where id > (select id from t_table where a=xxx limit 1000000,10) limit 10
晚霞
1 评论
    chatgtpChrome 114Windows 10
    6月20日回复

    chatgtp unlimited Free use this website