2013年12月

MySQL大数据量表中删除重复记录

   最近工作中需要抓取大量新闻,抓取的数据中由于一些原因存在一些重复数据,而整个数据表的记录数接近10万条,大小接近1个G,又在我自己的渣渣本本上,查询速度十分不理想,想要完成一个最基本的查询都很困难。在看了一些相关资料后终于找到解决方法,分享给大家参考。
   首先说一下新闻表的大概结构,主要是包含id、title、content等字段,其中title字段使用较为频繁,并且需要用该字段判断重复记录,所以我们先给title字段添加索引。添加索引后我们可以使用以下语句来很快地查询出哪些title是重复的:

SELECT `title` FROM `info` GROUP BY `title` HAVING COUNT( `title` ) >1

但如果要一次查出重复字段的id的话就需要用到子查询了,可是子查询的效率很低,明显是不合适的,所以我们可以先建一个临时表:

CREATE TABLE `tmptable` AS (SELECT `title` FROM `info` GROUP BY `title` HAVING COUNT( `title` ) >1);

有了重复字段的标题接下来就可以查出重复字段的id了,我这里为了方便又建了一个临时表:

CREATE TABLE `idtable` AS ( SELECT min(a.`id`) AS id, a.`title` FROM `info` a, `tmptable` t WHERE a.`title` = t.`title` GROUP BY a.`title`);

这样删除重复字段就很容易了:

DELETE a FROM `info` a,`idtable` t WHERE a.`id` = t.`id`;

 
不过我这篇文章中的方法只适用于记录只重复了一次的情况,不过稍微改改就可以删除重复次数较多的记录,这里就不在赘述。

PHP收发扩散性百万亚瑟王数据包

   扩散性百万亚瑟王是去年在日本很火的一款卡牌类手游,今年盛大代理后国内玩家增长了很多,挂机科技也逐渐多了起来。大多数科技的源头应该都是Mawalker,非常感谢原作者的无私开源,才能促成现在科技百花齐放的情况,造福广大玩家。
   我想将mawalker用php来改写出来,无奈在收发数据包方面就卡住了。后来在群友的帮助以及网上查找到的资料的帮助下终于完成了,于是便将最基本的登录代码公布出来以供大家参考。

require("snoopy.php");
$key = "uH9JF2cHf6OppaC10000000000000000";
$url = "http://web.million-arthurs.com/connect/app/login?cyt=1";
$vars['login_id'] = Security::encrypt('yourid' , $key );
$vars['password'] = Security::encrypt('password' , $key );
$snoopy = new Snoopy();
$snoopy->agent = "Million/250 (t03gchn; t03gzc; 4.1.2) samsung/t03gzc/t03gchn:4.1.2/JZO54K/N7100ZCDMD3:user/release-keys GooglePlay";
$snoopy->rawheaders["DontTrackMeHere"] = "gzip, deflate";
$snoopy->submit($url, $vars);
$ret = $snoopy->results;

echo Security::decrypt(base64_encode($ret), $key );

class Security {
    public static function encrypt($input, $key) {
    $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
    $input = Security::pkcs5_pad($input, $size);
    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, $key, $iv);
    $data = mcrypt_generic($td, $input);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    $data = base64_encode($data);
    return $data;
    }

    private static function pkcs5_pad ($text, $blocksize) {
        $pad = $blocksize - (strlen($text) % $blocksize);
        return $text . str_repeat(chr($pad), $pad);
    }

    public static function decrypt($sStr, $sKey) {
        $decrypted= mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        $sKey,
        base64_decode($sStr),
        MCRYPT_MODE_ECB
            );

        $dec_s = strlen($decrypted);
        $padding = ord($decrypted[$dec_s-1]);
        $decrypted = substr($decrypted, 0, -$padding);
        return $decrypted;
    }   
}

   代码中使用了snoopy类,这个类可以很容易找到,而aes编解码所使用的类也是网上找到的,可以兼容java的aes编解码。snoopy类也可以换成curl,有能力的可以自己改。另外login的登录加密key是不带login_id的,另一种加密的key需要带login_id,具体可以看mawalker。