简而言之:“1 个查询可以在 0.5 秒内将数据写入 25,000 行,在一个循环中即使 10 分钟也不够,而在一个循环中,在 1.5 秒内执行了 25,000 次选择。有人怀疑每次更改后都会发生可怕的操作, 是否覆盖缓存, 日志条目”。
详细地
移动到新服务器后遇到问题。
php 脚本,将数据写入或更新到数据库 - 速度慢 4 倍甚至 100 倍
新服务器的磁盘写入速度为 230 MB/s,而旧服务器为 76.6 MB/s。
我认为问题出在垃圾收集器中 - 我启动了一个循环 10,000,000 次操作,其中变量递增。同样,新服务器执行命令的速度更快
所有配置的设置已被转移,没有更改
新服务器将具有两倍数量的处理器内核和 RAM。php-fpm mysql 版本是一样的。
我不知道还要测试什么,我什至不明白该往哪个方向看,因为两台机器中的设置都是一样的
从数据库中读取多个查询(在 25,000 次测试的循环中)在不同的服务器上以相同的速度发生,但写入或更新 - 具有惊人的
数据库已移至新服务器
添加了 Mysql 设置 - 但它们没有帮助 - 这些是
#Фича, которая избавляет от постоянной записи в логи сразу после добавления инфы
innodb_flush_log_at_trx_commit = 2
#Вырубаем буферизацию таблиц для файловой системы и говорим MySQL обращаться к файлам напрямую
innodb_flush_method = O_DIRECT
#Отключение двойной буферизации
innodb_doublewrite = 0
基本设置
query_cache_limit = 1M
query_cache_size = 16M
log_error = /var/log/mysql/error.log
slow_query_log_file = /var/log/mysql/mysql-slow.log
slow_query_log = 1
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[isamchk]
key_buffer = 16M
今天我尝试用插入到 100 行数据库中的相同文本编写 1000 个文件,结果令我惊讶:它在 0.14 秒内写入 1000 个文件,在 3.2 秒内写入数据库中的 100 行,而一个 MySQL 查询可以填满25,000行0.5秒——什么样的现象还没弄清楚
测试代码
for( $i=0; $i < 100; $i++ ){
$site->mySqli->query('UPDATE `test_table` SET `test`= \''.$text.'\' WHERE `id` = \''.$i.'\' ) ');
}
确保您不会在每次请求时都重新连接到数据库(这很长,如果您这样做 10,000 次,很可能需要 10 分钟)。
尝试使用生成器来减少使用的内存量。
http://php.net/manual/en/language.generators.syntax.php
我认为多个更新的工作速度比许多单个更新快得多是正常的。
由于 DBMS 通过多次更新执行优化,因为发送/接收请求不会花费时间,因为更新期间会发生准备操作等。索引也在重建——也许这是你刹车的主要原因(问题不仅是要更新多少,而是你的更新“命中”了多少索引)。
但是,如果您的应用程序可以在单个 http 请求中发出 25k 个更改请求,那么将多个请求打包成一个请求是完全合理的。还有一件事 - 尝试将这些更新包装在事务中,并发布结果。
iostat -x 1
在长时间记录期间用命令检查硬盘- 磁盘加载到 96-100%My.cnf 设置 - 不起作用,因为我输入了错误的设置组
解决方案:
写入后写入my.cnf
来自顿涅茨克的 Evas 的建议有所帮助,我引用:
“好吧,至少,innodb_buffer_pool_size 必须大于等于 InnoDB 数据大小,并且 Key 缓冲区大小必须大于等于整个索引大小,innodb_flush_log_at_trx_commit = 0 和 innodb_flush_method = O_DIRECT。InnoDB 比 Myisam 慢,但是在crash后恢复方面比较可靠。最好注意my.cnf的正常设置,阅读各种手册,人的建议等。好吧,一般来说,这方面聘请专家会更可靠.
PS SSD 驱动器也将显着加快你所有的好..."