我很少来这里问问题,因为我通常通过努力挖掘来找到答案,但这次我没有看到解决方案,我真的很沮丧。
我正在使用 MariaDB 设置一个 Docker 容器,并使用以下 Dockerfile:
FROM mariadb:latest
WORKDIR /app
我用以下命令编译这个 Dockerfile:
docker build --rm -t mysql_mariadb .
我有这个 docker-compose.yml:
name: mariadb_app
services:
app:
image: mysql_mariadb
environment:
MARIADB_ROOT_PASSWORD: "test"
ports:
- "3307:3307"
networks:
- nets
volumes:
- ./Config/mariadb.cnf:/etc/mysql/mariadb.cnf:ro
- C:/Docker/Data/MariaDB_DATA:/var/lib/mysql
networks:
nets:
external: true
我用它来启动容器:
docker-compose -f docker-compose.yml up --build -d
最后这是“mariadb.cnf”文件:
[mysqld]
wait_timeout = 28800
interactive_timeout = 28800
max_allowed_packet = 256M
port = 3307
我从 PHPMyAdmin 访问它,一切看起来都很好。它连接良好并且数据库工作正常。一切都很顺利,直到我迁移了大量数据,并运行了涉及多个表的查询..这里出现了一个问题,我仍然没有找到任何解决方案。
查询:
SELECT a.id, a.name AS name, a.label AS label, c.name AS category, a.plays,
(SELECT COUNT(*) FROM user_favorites WHERE audio_id = a.id) AS favs
FROM audios AS a
INNER JOIN audio_categories AS c ON a.category_id = c.id
ORDER BY c.datetime ASC, a.datetime ASC;
(请不要评论查询的可能改进,这不是我来这里的原因)
我有与 wamp64 (Windows 服务器)相同的 MariaDB 数据库,它具有完全相同的表和数据,并且我运行了完全相同的查询。在 PHPMyAdmin 中,结果是这样的:
Showing rows 0 - 24 (total of 1745, The query took 0.6545 seconds.)
当我在容器数据库中运行查询时,我得到的是:
Showing rows 0 - 24 (total of 1745, The query took 31.6956 seconds.)
0.6 秒 vs 31.69 秒。这怎么可能?
我尝试了一切,我更改了 mariadb.cnf 文件中的所有设置,我检查了资源使用情况(我已经在 yml 中分配了更多的 cpu 和 ram),这也是通过在容器中本地执行查询来实现的,因此它不是网络问题。 我什至尝试不使用 mariadb:latest 映像,使用 debian 并手动安装 mariadb。相同的结果...我不知道还能做什么,我不知道如果是相同的数据库、相同的配置、相同的数据和相同的查询,为什么时间上会有这么大的差异。
我读到一个答案,建议将“innodb_flush_log_at_trx_commit”设置修改为2或0。也没有结果..
一切都表明这是一个docker和资源分配问题,但我尝试过的任何方法都对我不起作用。
我已经被这个问题困扰好几天了,我真的需要帮助。
谢谢。
这怎么可能
EXPLAIN SELECT ... ; SHOW WARNINGS;
。LIMIT 25
。 _这可能会显着改变查询优化。因此,请手动添加 LIMIT 25
以获取这些解释。(
innodb_flush_log_at_trx_commit
应该是无关紧要的,因为你不是INSERTing
。)