Docker 和 MariaDB,查询真的非常慢

问题描述 投票:0回答:1

我很少来这里问问题,因为我通常通过努力挖掘来找到答案,但这次我没有看到解决方案,我真的很沮丧。

我正在使用 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和资源分配问题,但我尝试过的任何方法都对我不起作用。

我已经被这个问题困扰好几天了,我真的需要帮助。

谢谢。

docker mariadb containers
1个回答
0
投票

这怎么可能

  • MySQL 和 MariaDB 中的优化器存在显着差异。
  • 更快的可能会重新制定查询 - 请为每台服务器提供
    EXPLAIN SELECT ... ; SHOW WARNINGS;
  • 提供的查询似乎不完整——“显示行0-24”来自哪里?就好像 UI 正在添加
    LIMIT 25
    。 _这可能会显着改变查询优化。因此,请手动添加
    LIMIT 25
    以获取这些解释。

innodb_flush_log_at_trx_commit
应该是无关紧要的,因为你不是
INSERTing
。)

© www.soinside.com 2019 - 2024. All rights reserved.