Heim >Datenbank >MySQL-Tutorial >从mysql读取大量数据时的实践_MySQL

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

WBOY
WBOYOriginal
2016-05-30 17:10:461229Durchsuche

背景

 

程序启动时,从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很大时。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn