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這個,極速入庫
數據庫表結構:

日志文件格式:

可以快速地將日志文件入庫數據庫
