Mysql
我應該如何將 apache 日誌保存到 mysql 表中?
這是一個用於查看 apache 日誌的 php 腳本。
我想將 apache 日誌保存到 mysql 數據庫中。
然後使用 mysql REGEXP 搜尋添加一些標記 url 的規則,例如: SET tag=‘some tag’ WHERE url REGEXP ‘some pattern’;
a)我是否應該在每次訪問它們時使用一個表來儲存所有 url,即使它們重複然後進行 REGEXP 搜尋並將標籤應用於所有這些?
b)或者最好保存一個具有唯一 url 的表,以及另一個具有 url 的 id 和訪問時間的表?然後,如果 url 重複,則標記將應用於該行較少的表。
如果選項 ‘b’ 更好,我應該為唯一 url 使用什麼樣的索引?varchar(4000) 主鍵?我正在考慮創建 url 字元串的 md5 雜湊並將其用作主鍵,因為它會更短。
我問這個問題是因為我想知道在以下情況下什麼是最佳性能:
- 使用正則表達式搜尋標記許多 url
- 將數千個 url 導入一張表並確保它們是唯一的
謝謝!
因為這實際上是您正在擷取的記錄數據,所以我首先將其儲存為原始形式,然後根據需要對其進行 ETL/規範化。
對於搜尋,您可以將 URL 的前幾個字元編入索引。假設選項是 http:// 和 https:// - 然後將索引大小限制為通過協議部分的三個字元。
CREATE TABLE log ( datetime_created DATETIME, url VARCHAR(1024), domainname VARCHAR(255), someotherdata VARCHAR(255), ... INDEX `idx_domain` (domainname(3))) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
- InnoDB 將允許您在不鎖定它的情況下搜尋表。
- 壓縮將有助於磁碟空間。
- INDEX
idx_domain
(domainname(3)) 將索引域名列的前 3 個字元並加快搜尋速度。但是,REGEXP 的策略將是嘗試在域名的前面進行匹配。如果網站變得流行,規模最終將成為一個問題,所以買家要小心。
為什麼不使用 apache mod_log_sql ?它幫助我將所有日誌資訊直接發送到 Mysql DB。但是讓我提醒您,在負載較重的伺服器上使用它會導致一些問題,我看到的 1 個最大問題是 Mysql 連接超時。