>데이터 베이스 >MySQL 튜토리얼 >从mysql读取大量数据时的实践_MySQL

从mysql读取大量数据时的实践_MySQL

WBOY
WBOY원래의
2016-05-30 17:10:461228검색

背景

 

程序启动时,从mysql读取所有的数据,在内存中建立数据结构。mysql表中至少有100w条记录。以后根据时间定期从mysql增量读取数据,刷新内存结构。

 

表结构为{uid, product, state, modify_time,primary key(uid, product), key(modify_time)}

 

方法一

 

因为增量的更新都是按照modify_time来的,所以直观的想到根据modify_time来分页读取,每次读取1w行记录,循环100次就能全部读取100w条记录。

 

于是select * from table  order by modify_time limit 0,10000 直到limit 990000,10000。乍一看没什么问题。但是程序启动居然超过5分钟。用explain分析一下select语句的耗时,发现limit 990000, 10000时居然耗时几秒钟,确实用到了索引modify_time,但是扫描行数超过了5万多行。omg. 对于大数据量时,同一索引下有太多的数据,越往后查找越耗时。100w后数据就已经使系统不可用了。

 

方法二

 

表结构加一个字段,id自增类型,并建立唯一索引。查询语句变成select * from table where id >=m and id

 

结论

 

从mysql查询时要避免limit m,n, 当m很大时。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.