[英]MariaDB & MySQL very slow on Windows 10
我在 Windows 10 (i5,ssd) 機器上使用 WAMP 並注意到網站速度很慢。 比我的舊 Windows 7 (i3,hd) PC 慢得多。
當我用計算循環一個簡單的腳本時: Win10: 0.4 sec Win7: 9.5 sec
但是當我在循環中添加數據庫查詢時,情況正好相反: Win10: 147 sec Win7: 15 sec
我使用的腳本在表“test”中插入一個簡單的哈希:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`testvalue` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
PHP 測試腳本:
<?php
set_time_limit(0);
$time_start = microtime(true);
$insertTotal = 100000;
$servername = "127.0.0.1";
$username = "root";
$password = "";
$dbname = "speedtest";
$db = new mysqli($servername, $username, $password, $dbname);
$db->query("TRUNCATE test");
for($i=0;$i<$insertTotal;$i++)
{
$db->query("INSERT INTO test VALUES(null,'".md5(time().rand(0,999999999))."')");
}
$time_end = microtime(true);
$execution_time = ($time_end - $time_start);
echo 'Total exec time: '.$execution_time.' sec.';
有很多關於這個的話題,所以我將總結我已經做過的所有事情:
在 my.ini 中提出了很多緩沖區:
key_buffer_size = 512M
max_allowed_packet = 64M
table_open_cache = 256
sort_buffer_size = 4M
net_buffer_length = 8K
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 128M
那么我在這里還缺少什么?
一些附加信息:執行腳本時,SSD 的負載為 0%,CPU 的負載約為 30%。
更新:
INSERT
批處理 100 行; 它的運行速度大約是原來的 10 倍。autocommit
與 MyISAM 無關。INSERTs
有其他問題。 要么做上面的批處理,要么只在一個事務中插入 100 個插入。 (在任何一種情況下超過 100 都是“收益遞減”。)#update#我的電腦確實有問題。 我最后修復了它( https://superuser.com/questions/1584203/windows-10-very-slow-how-to-find-the-cause ),現在測試腳本的運行速度提高了 34 倍。 因此,使用多值插入的更好的腳本也更快。 現在整個 WAMP 的運行速度要快很多倍。 很高興這已解決。 #更新#
在這個問題上花了很多時間之后,我繼續研究我的實際導入腳本,突然意識到我一直在錯誤的樹上咆哮。 我一直在嘗試解決一個實際上不是問題的問題。
當然,這是不正確的,當舊 PC 可以執行 50.000 左右時,我的寫入速度為每秒 500 個單獨查詢,但畢竟我永遠不應該使用單獨查詢。 我如此專注於這個問題,以至於我沒有意識到性能問題並沒有影響 MySQL 和 MariaDB 可以做的所有其他事情。
所以里克詹姆斯的回答實際上是正確的想法。
對不起,浪費你的時間。 感謝你們對我的幫助! 我以前一直在處理問題並解決它們,但從來沒有處理過一個根本不是真正問題的問題!
舉個例子,我稍微修改了測試腳本。 這可以在大約 14 分鍾內插入 2 億行:
<?php
set_time_limit(0);
$time_start = microtime(true);
$insertTotal = 200000000;
$servername = "127.0.0.1";
$username = "root";
$password = "";
$dbname = "speedtest";
$db = new mysqli($servername, $username, $password, $dbname);
$db->query("TRUNCATE test");
$counter = 0;
$sql = array();
for($i=0;$i<$insertTotal;$i++)
{
$sql[] = "(null,'".md5(time().rand(0,999999999))."')";
if($counter == 5000)
{
$sql = implode(",",$sql);
$db->query("INSERT INTO test VALUES ".$sql.";");
$counter = 0;
$sql = array();
}
$counter++;
}
$sql = implode(",",$sql);
$db->query("INSERT INTO test VALUES ".$sql.";");
$time_end = microtime(true);
$execution_time = ($time_end - $time_start);
echo 'Total exec time: '.$execution_time.' sec.';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.