大文件日志快速解析入庫 - load data


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這個,極速入庫

數據庫表結構:

 

日志文件格式:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM