萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

Windows 7/10/11 連接本地 MySQL 極慢 (1秒延遲) 根因與解決:localhost 解析 IPv6

故障現象

  • PHP/應用連接本地 MySQL 耗時 ~1 秒
  • Xdebug 分析 95% 時間花在 mysqli_connect / PDO::__construct
  • 改用 127.0.0.1 瞬間恢復正常

根因分析

C:\> ping localhost
正在 Ping DESKTOP-ABC [::1] (IPv6) 具有 32 字節的數據:
來自 ::1 的回覆: 時間 <1ms
...

原因鏈:

  1. Windows 7+ hosts 預設註釋掉 IPv4 127.0.0.1 localhost
  2. DNS 解析 localhost 返回 IPv6 ::1
  3. 應用嘗試連接 [::1]:3306
  4. MySQL 預設綁定 0.0.0.0:3306 (IPv4) 或未啟用 IPv6 監聽
  5. IPv6 連線超時 (約 1 秒) 後回退 IPv4 127.0.0.1 成功

解決方案

方案一:應用層改用 127.0.0.1 (最簡單、推薦)

# PHP 配置
$host = '127.0.0.1';  // 而非 'localhost'

# JDBC URL
jdbc:mysql://127.0.0.1:3306/db

# Python
host = '127.0.0.1'

# .NET
Server=127.0.0.1;Port=3306;

方案二:修復 hosts 檔案 (系統級修復)

# C:\Windows\System32\drivers\etc\hosts
# 取消註釋或新增
127.0.0.1       localhost
::1             localhost  # 保留 IPv6 亦可

# 刷新 DNS 快取
ipconfig /flushdns

方案三:MySQL 啟用 IPv6 監聽

[mysqld]
bind_address = ::
# 或
bind_address = *
# 重啟後 netstat -an 可見 :::3306 (IPv6) 和 0.0.0.0:3306 (IPv4)

需 MySQL 5.5.3+ 支援,Windows 防火牆需放行 IPv6 入站 3306。

驗證修復

# 應用層測試
time php -r '$mysqli=new mysqli("localhost","root","pass","db"); echo "ok";'
# 修復前 ~1000ms,修復後 ~1-5ms

# 連線過程追蹤
mysql --protocol=tcp --host=localhost -u root -p -e "SELECT 1;"
# 加 --protocol=tcp 強制 TCP 而非 socket

延伸:Docker 環境同理

# 容器內連接宿主機 MySQL
# 錯誤:host.docker.internal 解析 IPv6
# 正確:host.docker.internal (Docker Desktop 自動映射 IPv4)
# 或使用宿主機實際 LAN IP

總結

Windows 7+ localhost 默認解析 IPv6,MySQL 未監聽 IPv6 導致 1 秒超時回退。
最佳實踐:應用配置一律使用 127.0.0.1,不依賴 localhost 解析。

copyright © 萬盛學電腦網 all rights reserved