2024年12月7日 星期六

如何透過優化 MySQL 資料庫結構,提升查詢效率

 優化 MySQL 資料庫結構是提升查詢效率的重要一環。以下是一些常見的優化技巧:

1. 索引設計

  • 選擇性高的欄位建立索引: 索引可以加速查詢,但過多的索引也會降低寫入性能。選擇查詢頻率高、且資料分佈均勻的欄位建立索引。
  • 複合索引: 當查詢條件涉及多個欄位時,建立複合索引可以提高查詢效率。複合索引的順序應根據查詢條件的頻率和選擇性來決定。
  • 避免冗餘索引: 冗餘索引不僅佔用空間,還可能降低寫入性能。定期檢查和清理索引是必要的。

2. 資料類型選擇

  • 選擇合適的資料類型: 選擇合適的資料類型可以減少存儲空間,提高查詢效率。例如,對於整數型資料,選擇 INT 比 VARCHAR 更高效。
  • 避免過大的資料類型: 過大的資料類型會佔用更多的存儲空間,降低查詢效率。

3. 正規化與反正規化

  • 正規化: 減少資料冗餘,保持資料一致性。但過度正規化可能會導致查詢次數增加,影響性能。
  • 反正規化: 為提高查詢效率,適當引入冗餘資料。但反正規化會增加維護成本,可能導致資料不一致。

4. 分區

  • 水平分區: 將一個大表拆分成多個小表,根據某個欄位的值進行分區。
  • 垂直分區: 將一個表中的列拆分到不同的表中,根據列的訪問頻率進行分區。

5. 資料庫引擎選擇

  • InnoDB: 支持事務、外鍵、MVCC,適合OLTP應用。
  • MyISAM: 性能較高,不支援事務、外鍵,適合只讀或插入頻率高的表。

6. 查詢優化

  • EXPLAIN: 使用 EXPLAIN 命令分析查詢執行計劃,找出性能瓶頸。
  • 索引覆蓋: 查詢結果只包含索引中的列,可以避免回表查詢,提高效率。
  • 避免全表掃描: 儘量使用索引來縮小查詢範圍。
  • 減少子查詢: 子查詢可能會導致性能下降,嘗試使用 JOIN 或 EXISTS 代替。

7. 其他優化

  • 緩衝池: 調整 InnoDB 緩衝池大小,提高數據訪問速度。
  • 慢查詢日誌: 記錄慢查詢,分析原因並優化。
  • 定期維護: 定期執行 OPTIMIZE TABLE、ANALYZE TABLE 等命令,優化表結構。

8. 應用層優化

  • 連接池: 減少建立和關閉連接的開銷。
  • 批量操作: 將多次查詢合併為一次,減少網絡開銷。
  • 緩存: 緩存查詢結果,減少對數據庫的訪問。

總結

優化 MySQL 資料庫結構是一個系統工程,需要綜合考慮多方面因素。沒有放之四海皆準的最佳方案,需要根據實際業務需求和數據特性進行調整。

建議

  • 收集性能數據: 透過 MySQL 提供的工具(如 slow query log、performance schema)收集性能數據,分析瓶頸。
  • 逐步優化: 優化是一個持續的過程,不要一次性修改過多配置,以免引入新的問題。
  • 權衡利弊: 優化需要權衡性能和成本,選擇最適合的方案。

2023年1月13日 星期五

JavaScript text to hyperlink 和 自動換行

nl2br() 函數在字符串中的每個新行(\n) 之前插入HTML 換行符(<br />)。 


function nl2br (str, is_xhtml) {

    var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br ' + '/>' : '<br>';

    var regex = /(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/=\/_\.]*(\?\S+)?)?)?)/ig

    var str = str.replace(regex, "<a href='$1' target='_blank'>$1</a>");

    return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');

}

2022年9月12日 星期一

設定 Apache 的 mod_reqtimeout 避免 DDOS 攻擊

如何緩解Slowloris 攻擊?

對於易受Slowloris 攻擊的Web 服務器,有一些方法可以減輕某些影響。易受攻擊的服務器的緩解措施可以分為3 大類:

增加服務器可用性- 增加服務器在任何時間允許的最大客戶端數量,這將增加攻擊者使服務器過載前必須建立的連接數。實際上,無論增加多少,攻擊者都可以擴展攻擊數量以攻克服務器容量。

限制傳入請求的速率- 基於某些使用因素限制訪問,這將有助於緩解Slowloris 攻擊。限制單個IP 地址允許建立的最大連接數,限制慢速傳輸速度,以及限制客戶端允許保持連接的最長時間,這些技巧都是限制慢速攻擊的有效方法。


在 Apache 2.4 中已經內建 mod_reqtimeout,只需要先在 httpd.conf 中把 # 拿掉啟用即可

LoadModule reqtimeout_module modules/mod_reqtimeout.so


例子

等待5秒以完成TLS握手,等待10秒以接收請求標頭,等待30秒以接收請求正文:

RequestReadTimeout handshake=5 header=10 body=30

至少等待10秒鐘以接收請求正文。如果客戶端發送數據,則每接收1000個字節,將超時增加1秒,沒有超時上限(除非間接限制為 LimitRequestBody):

RequestReadTimeout body=10,MinRate=1000

至少等待10秒鐘以接收請求標頭。如果客戶端發送數據,則每接收500個字節將超時增加1秒。但請求標頭的時間不得超過30秒:

RequestReadTimeout header=10-30,MinRate=500

通常,服務器應同時配置標頭超時和主體超時。如果將通用配置用於http和https虛擬主機,則超時不應設置得太低:

RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500


接下來就是設定

<IfModule reqtimeout_module>

RequestReadTimeout header=20-30,MinRate=256 body=100-120,MinRate=512

</IfModule>

2022年9月5日 星期一

什麼是反惡意軟件服務可執行文件(antimalware service executable)?

 什麼是反惡意軟件服務可執行文件(antimalware service executable)?

反惡意軟件服務可執行文件(antimalware service executable)是Windows 10 系統內建 Windows Defender 防火牆下的一個後台進程。此程序也稱為MsMpEng.exe,是Windows操作系統的一部分,始終在後台運行。當用戶訪問檔案時, Windows Defender 負責掃描檢查是否夾帶病毒軟體、安裝病毒定義檔等工作,因此需要使用到磁碟資源、記憶體RAM和CPU。您可以從Windows 10附帶的Windows Defender安全中心應用程序配置Windows Defender,執行掃描並檢查其掃描歷史記錄。

它是病毒嗎?

目前,還沒有任何證據與報告來假裝模仿反惡意軟件服務可執行文件。Windows Defender本身就是一個防病毒軟件。常規後台掃描對於任何防病毒程序都是正常的。因此我們可以相信antimalware service executable這個後台進程對我們來說是安全的。

它為什麼佔用CPU或磁盤資源?

突然的大量使用到CPU或磁盤資源使用表示它可能在掃描您的計算機以查找惡意軟件或定期安裝包含新惡意軟件信息的更新。所有這些程序都需要使用一些系統資源來檢查您的PC並保護您的安全。

怎麼解決antimalware service executable 對於CPU/記憶體使用率過高呢?

但是很多剛剛更新成windows10的用戶不習慣,他們覺得資源占用的情況太過明顯,想要關閉反惡意軟件服務可執行文件(antimalware service executable)以解決CPU/記憶體使用率過高的問題。到底該怎麼解決antimalware service executable 對於CPU/記憶體使用率過高呢?

 

事實上,如果您沒有安裝任何其他防病毒軟件,我們建議您不要禁用Windows Defender防病毒工具和關閉antimalware service executable。雖然,您無法永久禁用它。因為如果Windows Defender未檢測到安裝的其他防病毒應用程序,它將在短時間後重新啟用。


將antimalware service executable 添加到 Windows Defender 的排除列表中

步驟 1. 同時按住Windows鍵+ I ,打開「設定」。點擊「更新與安全性」。

步驟 2. 點擊「Windows Defender」,點擊添加「排除項目」。

步驟 3. 點擊「排除.exe, .com, .scr 程序」。

添加到Windows Defender - 1

步驟 4. 輸入:MsMpEng.exe ,點擊「確定」。


2022年8月30日 星期二

XAMPP CI3 Git 洩漏?

 許多工程師在撰寫程式時,會使用 Git 來做版本控管,在使用 Git 的時候,目錄底下會產生一個 .git 的隱藏檔案,裡面就是 git repository,會儲存程式的修改、新增、刪除等紀錄。

若工程師直接將含有 .git 目錄的專案放到網頁伺服器的公開目錄,駭客便有可能下載 .git 中的資料,利用 git 的機制將原始碼重建。

因此當工程師開發完成時,可能有兩個方法發佈較為妥當:

額外將網頁程式碼製作一個副本 (不含 .git),再發佈到網頁伺服器。

直接將含 git 目錄的專案放到網頁伺服器,但同時做好網頁的權限控管,也就是當你瀏覽 /.git 底下的全部內容時,會回傳 403。

假如工程師在測試登入功能時,將 admin 的帳密紀錄在程式的註解中,並使用 git 紀錄到歷史版本中,當工程師不小心上傳 .git,並且沒有做權限控管,那麼駭客就能從洩漏的 .git 目錄中拿到帳密。

此外,因為 .git 洩漏是已知且普遍的問題,有眾多工具可以協助駭客下載 .git 目錄並重建原始碼,只要網頁不小心將 .git 上傳,那就有許多人可以將網頁的 .git 下載下來,反倒甚至出現針對這種工具漏洞的攻擊:

攻擊者會構建惡意的 .git 目錄,故意將其中的一些資料路徑修改,例如將文件路徑加上很多 ../../../ ,一旦重建工具沒有檢查路徑,重構資料就可以隨意覆蓋到你的正常檔案。


一般來說,只要網址/.git 可以看到東西,基本上就能將程式還原,但是有時候網址輸入 /.git 會出現 403 (「無權」訪問指定的URL而非 「檔案不存在」,代表 .git 目錄可能是存在的,你可以嘗試 /.git/config,看他有沒有擋),或是用其他方式拿到 .git 的資料,例如下載

網址/.git/logs/HEAD 儲存 git 的 log,可以找到歷史 commit

網址/.git/refs/heads/master 會記錄 master 的 commit hash,可以分解出該 commit 的資料

網址/.git/refs/heads 底下會放所有分支的名字資料夾

網址/.git/refs/stash 用於暫時保存 git 工作進度,可以把做到一半的東西先藏起來(stash),不要 commit 出去

git stash list 顯示 stash 內的所有內容

git stash pop 把剛剛做到一半存在 stash 的資料還原

網址/.git/info/packs packs 的件提取與恢復 (比較少考)

網址/.git/index 會儲存 git add 的資料


<Directory "C:/xampp/htdocs">

    Options Includes FollowSymLinks ExecCGI


    AllowOverride All


    Require all granted

    Header set Access-Control-Allow-Origin *

    RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)

</Directory>


<DirectoryMatch "^/.*/\.git/">

    Order allow,deny

    Require all denied

</DirectoryMatch>

2022年3月9日 星期三

Apache 核心功能 AcceptFilter Directive 深入探討

AcceptFilter 指令簡介

AcceptFilter 是 Apache HTTP 伺服器中一個重要的指令,用於配置伺服器如何接受新的連線請求。它直接影響伺服器的效能,尤其是當伺服器面臨高併發連線時。

AcceptFilter 的作用

  • 控制連線接受方式: AcceptFilter 指令指定了 Apache 如何處理 incoming connections。不同的配置會影響伺服器處理連線的順序和方式。
  • 影響伺服器效能: 合理配置 AcceptFilter 可以提升伺服器的效能,特別是在高併發環境下。
  • 適應不同硬件環境: 不同的硬件配置和作業系統可能需要不同的 AcceptFilter 設定。

AcceptFilter 的值

常見的 AcceptFilter 值有:

  • accept: 這是最基本的配置,按照連線到來的順序依次處理。
  • prefork: 為每個子進程預先分配一個 accept() 鎖,提高處理連線的速度。
  • http: 使用 HTTP 協議的 accept() 系統調用。
  • mPM: 由多處理模組 (MPM) 決定如何處理連線。

不同 AcceptFilter 值的比較

AcceptFilter 值描述優點缺點
accept按順序處理連線配置簡單在高併發下可能導致性能瓶頸
prefork為每個子進程預先分配 accept() 鎖提高連線處理速度可能消耗更多系統資源
http使用 HTTP 協議的 accept() 系統調用可以利用一些 HTTP 特性可能不適用於所有情況
mPM由 MPM 決定靈活性高配置較複雜

如何選擇合適的 AcceptFilter

選擇合適的 AcceptFilter 取決於以下因素:

  • 硬件配置: CPU、記憶體等硬件資源的限制會影響 AcceptFilter 的選擇。
  • 作業系統: 不同的作業系統對 AcceptFilter 的支持可能有所不同。
  • 應用程序需求: 不同的應用程序對連線處理的要求也不同。
  • 伺服器負載: 高併發環境下,需要選擇能高效處理連線的配置。

示例配置

Apache
<IfModule mpm_prefork_module>
    AcceptFilter prefork
</IfModule>

上述配置表示使用 prefork 模式,為每個子進程預先分配 accept() 鎖。

注意事項

  • MPM 的影響: AcceptFilter 的效果會受到 MPM 的影響,不同的 MPM 有不同的特性。
  • 其他配置項: AcceptFilter 只是 Apache 配置的一部分,需要與其他配置項配合使用才能達到最佳效果。
  • 性能測試: 最好的方式是通過性能測試來確定最適合的 AcceptFilter 配置。

總結

AcceptFilter 是 Apache 伺服器中一個重要的配置項,它直接影響伺服器的性能。選擇合適的 AcceptFilter 值需要綜合考慮硬件、軟體、應用程序等多方面的因素。通過合理的配置,可以提升伺服器的性能,提高用戶體驗。

2022年3月8日 星期二

Apache假死堵塞卡死無響應解決方法

 啟用MPM模組配置文件

Apache針對不同的作業系統提供了多個不同的MPM模組,例如:mpm_beos、mpm_event、mpm_netware、mpmt_os2、mpm_prefork、mpm_winnt、mpm_worker。

Windows作業系統上默認的MPM模組是mpm_winnt,mpm_winnt模組是專門針對Windows作業系統而優化設計的MPM模組。它只創建一個單獨的子進程,並在這個子進程中輪流產生多個線程來處理請求。

在對Apache的MPM模組具備一定了解後,我們就可以針對不同的MPM模組來修改Apache的最大並發連接數配置了

修改任何文件,建議做好備份。

apache\conf\httpd.conf文件中啟用該配置文件


# Server-pool management (MPM specific)

Include conf/extra/httpd-mpm.conf (去掉該行前面的注釋符號"#")

對應的配置參數作用如下:


ThreadsPerChild:每個子進程的最大並發線程數。 

MaxRequestsPerChild:每個子進程允許處理的請求總數。如果累計處理的請求數超過該值,該子進程將會結束(然後根據需要確定是否創建新的子進程),該值設為0表示不限制請求總數(子進程永不結束)。 

該參數建議設為非零的值,可以帶來以下兩個好處: 

1. 可以防止程序中可能存在的記憶體泄漏無限進行下去,從而耗盡記憶體。 

2. 給進程一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動進程的數量。

注意:在以上涉及到統計請求數量的參數中,對於KeepAlive的連接,只有第一個請求會被計數。


修改MPM模組配置http-mpm.conf文件中的相關配置


在Apace安裝目錄/conf/extra目錄中有一個名為httpd-mpm.conf


#由於mpm_winnt模組只會創建1個子進程,因此這裡對單個子進程的參數設置就相當於對整個Apache的參數設置。

<IfModule mpm_winnt_module>

ThreadsPerChild 521 #默認值是150,推薦設置:小型網站=1000 中型網站=1000~2000 大型網站=2000~3500

MaxRequestsPerChild 3000 #推薦設置:小=10000 中或大=20000~100000

</IfModule>

再考慮一個可能,(apache 2.4)


apache 2.4 IE10瀏覽器會導致Apache2.4版本阻塞假死,有一種說法,用IE10登錄了網站,導致了apache的卡死,這裡做一個防範:

在配置文件httpd.conf中添加如下兩句


AcceptFilter http none

AcceptFilter https none



原文網址:https://kknews.cc/code/2no3569.html

WSL2 + Laragon:打造極速 Laravel 專業開發環境完整教學

  WSL2 + Laragon:打造極速 Laravel 專業開發環境完整教學 核心架構 Windows 負責入口與網域解析(Laragon Nginx 反向代理 + *.test ), WSL2 負責真正的 Linux 執行環境與極速檔案 I/O。 這是目前 Windows ...