100w行日志
由左到右值分别是 book_id | menu_id | userid
我需要每天每个用户读了多少本书(不重复)多少章节,以及每本书有多少章节被阅读,以及每个章节的pv或者uv
转成这样的结构存储
a、一条条解析,每条更新一遍where menuid 和booid的记录的pv和uv值
b、一行行读取,将全部值入库到redis并在redis计算出pv和uv,最终读取完以后shell的load data文件形式导入到MySQL
c、将原始数据入库MySQL,然后直接MySQL之中存储过程搞定
获取不重复的记录数 count(distinct p_id)
INSERT INTO book_read_log SELECT book_id,menu_id,COUNT(*) pv,COUNT(DISTINCT ggid) uv,time as date,platform FROM menu_access_log GROUP BY book_id,menu_id
如果一行一行文件的读然后解析入库,不断地查表,100w行的文本,10个小时
转redis一并计算好pv和uv之后,一并入库3小时
使用MySQL的load data之后同库解析60s不到
<?php $dbms='mysql'; //数据库类型 $host='localhost'; //数据库主机名 $dbName='test'; //使用的数据库 $user='root'; //数据库连接用户名 $pass='123456'; //对应的密码 $dsn="$dbms:host=$host;dbname=$dbName"; try { // 这里PDO::MYSQL_ATTR_LOCAL_INFILE => true需要设置 $options = [PDO::MYSQL_ATTR_LOCAL_INFILE => true]; $dbh = new PDO($dsn, $user, $pass,$options); //初始化一个PDO对象 $file = 'user.log';//2,rose,18; $line_cut = ";".PHP_EOL; $sql = 'LOAD DATA LOCAL INFILE "'.$file.'" IGNORE INTO TABLE user CHARACTER SET "utf8" FIELDS TERMINATED BY "," LINES TERMINATED BY "'.$line_cut.'" (id,name,age);'; $dbh->exec($sql); // 断开连接 $dbh = null; } catch (PDOException $e) { exit($e->getMessage().PHP_EOL); }
我表示非常满意load data这个,极速入库