2000万+数据里筛选不同的手机号
背景:接到个任务需要筛选出订单号里的所有不同的手机号,订单数约在2000万+
思路
1.分批获取数据库数据。
2.根据手机号前四位,将取出来的数据分别放在以手机号前四位开头的文件中。如:1880502xxxx 放在文件1880里,1881502xxxx 放在1881里。这些文件统一放在A文件夹下。
3.遍历文件夹A,判断文件是否超出某个设定值,值可由自己定。如果超出,以流式的方法将文件内容读进php,防止内存不足。然后继续拆解,再放进另一个文件夹之中,如:188050210xx 放进 188050210文件中,188050211xx 放假188050211文件中。
4.直到最后所得到的文件小于设定值,则可一次性读到php中,并拆解成数组,使用array_unique函数,一次性获得唯一不重复的号码。
mysql orderby和limit丢失数据问题
mysql limit 和 order by 同时使用时丢失数据问题记录:
SELECT id
,mode
,target_id
,fee
,begin_time
,end_time
FROM pft_module_price WHERE type
= 1 ORDER BY rank DESC LIMIT 0,10
SELECT id
,mode
,target_id
,fee
,begin_time
,end_time
FROM pft_module_price WHERE type
= 1 ORDER BY rank DESC LIMIT 10,10
两条sql执行时,两次的运行结果中会出现一些重复数据和丢失一些数据。猜测是rank值都一样的情况下,两次排序是不一样的,导致两次取得值会出现重复和丢失。
SELECT id
,mode
,target_id
,fee
,begin_time
,end_time
FROM pft_module_price WHERE type
= 1 ORDER BY rank,id DESC LIMIT 0,10
order by 的时候多加个 id,结果正常。
mysql using intersect导致效率变慢
explain SELECT DISTINCT `id`,`fid`,`aid`,`daction`,`dmoney`,`lmoney` FROM pft_member_journal WHERE `rectime` BETWEEN '2017-03-13 00:00:00' AND '2017-03-13 23:59:59' AND `fid` = 4 AND `aid` = 50618 AND `ptype` = 2
发现 extra里使用了using intersect。
通过设置 SET optimizer_switch = 'index_merge_intersection=off'
再次执行exolain sql语句 变成了using index condition 执行sql语句 速度变得飞快
或者强制不使用索引
SELECT DISTINCT `id`,`fid`,`aid`,`daction`,`dmoney`,`lmoney` FROM pft_member_journal IGNORE index(aid,fid) WHERE `rectime` BETWEEN '2017-03-13 00:00:00' AND '2017-03-13 23:59:59' AND `fid` = 4 AND `aid` = 50618 AND `ptype` = 2