AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-81130

Peter VARGA's questions

Martin Hope
Peter VARGA
Asked: 2020-07-26 05:45:03 +0800 CST

包含 CREATE TABLE 中所有属性的 PMA 导出

  • 1

这是导出的默认 PMA 输出:

CREATE TABLE `foo` (
  `id` int(11) UNSIGNED NOT NULL,
  `fk_id` int(11) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ALTER TABLE `foo`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `foo`
  MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT;

ALTER TABLE `foo`
  ADD CONSTRAINT `foo_ibfk_1` FOREIGN KEY (`fk_id`) REFERENCES `bar` (`id`),

...

有没有办法获得将以下所有内容ALTER TABLE合并到语句CREATE TABLE中的导出?

phpmyadmin mariadb
  • 1 个回答
  • 135 Views
Martin Hope
Peter VARGA
Asked: 2020-06-07 10:20:50 +0800 CST

OPTIMIZE 后 MyISAM 表的大小翻倍

  • 0

我有这张桌子:

CREATE TABLE `foo` (
  `CalculatedResultsId` int NOT NULL,
  `Md5Hash` char(32) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
  `SectionData` json NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

ALTER TABLE `foo`
  ADD UNIQUE KEY `CalculatedResultsId` (`CalculatedResultsId`),
  ADD UNIQUE KEY `Md5Hash` (`Md5Hash`);

其中包含约 400k 行,大小约为 800MB。这是 PMA 的输出:

在此处输入图像描述

然后我删除 2'454 行 [< 0.6%],这会产生大约 5MB 的开销,这也在PMA 中记录:

在此处输入图像描述

跑步OPTIMIZE Table突然使这张桌子的大小增加了一倍。我检查了目录中表文件的实际大小,这是正确的。真的翻倍了!

在此处输入图像描述

我的问题:

为什么,这是怎么回事?发生了什么事,是什么原因,桌子大小翻了一番?

我发现如何像以前一样减小表格大小的唯一方法是创建一个新表格并重新填充它。另一个非常奇怪的事实:

运行此命令以获取大表的副本CREATE TABLE foo_new AS SELECT * FROM foo;运行 27!这 400k 行的分钟数。

在此处输入图像描述

创建一个空表,然后复制INSERT INTO foo_new SELECT * FROM foo需要 24!秒。

为什么会有这样的差异?我不知道,但不知何故,它在我看来像是 MySQL 中一个非常严重的设计问题,或者是一个错误。

在 SLES 15.1 上运行的 MySQL 8.0.20

mysql performance
  • 2 个回答
  • 101 Views
Martin Hope
Peter VARGA
Asked: 2020-06-01 04:58:48 +0800 CST

无法摆脱 mysql.log 的创建

  • 0

我有这些设置my.cnf:

[mysqld]
...
disable_log_bin
general-log      = false
general_log_file = /var/log/mysql/mysqld.general.log

long_query_time     = 1
slow_query_log      = false
slow_query_log_file = /var/log/mysql/mysqld.slow.query.log

[safe_mysqld]
log-error = /var/log/mysql/mysqld.log

[mysqld_multi]
...
log        = /var/log/mysql/mysqld_multi.log

每次我启动 MySQL 服务器时,/var/log/mysql.log都会创建一个空文件,并且它永远不会被填充。我在网上搜索一些解决方案,但我没有找到任何关于mysql.log它似乎已经过时的东西。

可能它是由错误创建的,再次,因为我没有找到有关mysql.logMySQL 8.x 的任何内容,或者您​​知道如何避免创建?

我正在运行 MySQL 8.0.20

mysql logging
  • 1 个回答
  • 24 Views
Martin Hope
Peter VARGA
Asked: 2020-05-30 09:53:17 +0800 CST

MySQL 8 - 表达式中的用户变量已被弃用 [带有大量参数的 UDF 调用]

  • 2

我有这个:

SELECT
   @foo1 := UDF1(0, a, b, c, d) AS Foo1,
   @foo2 := UDF1(1, a, b, c, d) AS Foo2,
   @foo3 := UDF1(2, a, b, c, d) AS Foo3,
   @foo4 := UDF1(3, a, b, c, d) AS Foo4,
   @foo5 := UDF2( @foo1, @foo2, @foo3, @foo4) AS Foo5,
   @foo6 := UDF3( @foo1, @foo2, @foo3, @foo4) AS Foo6,
   @foo8 := UDF4( @foo5, @foo7, x, y, z) AS Foo8
FROM MyTable;

如您所见,它非常复杂,并且, , , ,a和b是c很d长的字段名称[这些名称表达了它们的功能]。xyz

我现在在 MySQL 8.0.20 上收到此错误消息:

X 在表达式中设置用户变量已被弃用,并将在未来的版本中删除。考虑替代方案:“SET variable=expression, ...”或“SELECT expression(s) INTO variables(s)”。

好的,这是一个错误的地方来讨论它是否有意义@var := value被弃用,所以我必须继续前进,我想确保如果安装了下一个 MySQL 更新程序不会停止工作。

我可以这样解决它:

SELECT
   UDF1(0, a, b, c, d) AS Foo1,
   UDF1(1, a, b, c, d) AS Foo2,
   UDF1(2, a, b, c, d) AS Foo3,
   UDF1(3, a, b, c, d) AS Foo4,
   UDF2(UDF1(0, a, b, c, d), UDF1(1, a, b, c, d), UDF1(2, a, b, c, d), UDF1(3, a, b, c, d)) AS Foo5,
   UDF3(UDF1(0, a, b, c, d), UDF1(1, a, b, c, d), UDF1(2, a, b, c, d), UDF1(3, a, b, c, d) ) AS Foo5,
   UDF3(UDF2(UDF1(0, a, b, c, d) , UDF1(1, a, b, c, d) , UDF1(2, a, b, c, d) , UDF1(3, a, b, c, d) ) ,
        UDF3(UDF1(0, a, b, c, d), UDF1(1, a, b, c, d), UDF1(2, a, b, c, d), UDF1(3, a, b, c, d) ), x, y, z) AS Foo6
FROM MyTable;

老实说,这不会造成伤害,而且我发现最糟糕的是,它变得如此难以理解,并且改变了我必须多次维护的任何调用--> 错误。

此外,在当前版本中,SELECT 的长度从 2'334 字节增加到 3'504 字节。


我正在尝试使用临时表,但填充表是一个相当长且 [无用] 复杂的 SELECT 使用LEFT JOINas@foo5依赖@foo1-4和@foo6依赖于@foo5。

这行得通,但我想知道是否可能有另一种我看不到的解决方案。建议SELECT expression(s) INTO variables(s)我不明白这对我的情况有何帮助。

正如我在开头所写的那样,我不明白为什么不推荐使用此功能,因为它显然可以解决很多麻烦并使复杂的 SELECT 语句变得更简单......

有什么建议么?

mysql deprecation
  • 2 个回答
  • 2313 Views
Martin Hope
Peter VARGA
Asked: 2020-05-21 07:38:49 +0800 CST

MyISAM 比 InnoDB 慢约 5 倍

  • 1

我认为,MyISAM由于其架构比InnoDB. 因此,我将此表的引擎更改InnoDB为MyISAM:

CREATE TABLE `table1` (
  `DateTime` datetime NOT NULL,
  `BidHigh` decimal(11,5) NOT NULL,
  `BidLow` decimal(11,5) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin COMMENT='1 minute rates';

ALTER TABLE `table1` ADD PRIMARY KEY (`DateTime`);

这些条件适用:

  1. 我正在一台 SLES 15.1 VM 上测试它,该 VM 在我的主机上具有 5 GB RAM 和 8 个 CPU 内核,并且它不必为其他 VM 提供服务[只是一个信息,表明没有其他 VM 可能会影响结果]。
  2. 一个 PHP 脚本正在运行数以千计的以下 SELECT 语句。
  3. 数据库中有 24 个上述表可以在 PHP 脚本中访问。
  4. 每个表有约 800k 行。
  5. 在每次测试之间,我都会重新启动服务器以确保始终存在相同的条件。由于差异如此之大,我没有运行多次测试来获得平均值......

执行时间:

  • 使用InnoDB引擎,脚本运行 199 秒。
  • 使用MyISAM引擎,脚本运行 1'026 秒。长5倍以上。

我正在运行这些 SELECT 语句:

SELECT `DateTime` FROM table1
     WHERE `DateTime` BETWEEN '2018-12-27 07:50:00' AND '2199-12-31 23:59:00'
        AND BidHigh > 0.96604
     ORDER BY `DateTime` LIMIT 1;

- 和 -

SELECT MIN( BidLow ) FROM table1
    WHERE `DateTime` BETWEEN '2018-12-27 07:45:00' AND '2199-12-31 23:59:00';

好的,我发现这是一个索引问题。添加这两个索引

ALTER TABLE `table1` ADD UNIQUE `BidHigh` (`DateTime`, `BidHigh`);

- 和 -

ALTER TABLE `table1` ADD UNIQUE `BidLow` (`DateTime`, `BidLow`);

修复了性能问题,现在脚本需要 245 秒,仍然慢于InnoDB- 这不是我所期望的......

将这些索引添加到InnoDB版本不会提高性能。


我的问题:

  1. 为什么InnoDB不需要这些索引并且仍然更快?
  2. 有更好的解决方案吗?
  3. 而且,我显然完全误解了MyISAM导致如此可怕表现的变化。
mysql performance
  • 3 个回答
  • 138 Views
Martin Hope
Peter VARGA
Asked: 2019-01-07 17:48:00 +0800 CST

INSERT 上的 MySQL 超时持续近 60 秒

  • 0

我有这张桌子:

CREATE TABLE `ClusterDescription` (
  `ClusterDescriptionId` int(11) NOT NULL AUTO_INCREMENT,
  `ClusterId` int(11) NOT NULL,
  `RightBarDateTime` datetime NOT NULL,
  `InstrumentId` int(11) NOT NULL,
  `RowCreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ClusterDescriptionId`),
  UNIQUE KEY `ClusterInstrumentId` (`ClusterId`,`InstrumentId`),
  KEY `InstrumentId` (`InstrumentId`) USING BTREE,
  KEY `OrderDesc` (`RightBarDateTime` DESC,`ClusterId` DESC)
) ENGINE=InnoDB AUTO_INCREMENT=3055989 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci 

该表有超过 3m 行。

我经常收到这个错误:

SQLSTATE[40001]:序列化失败:1213 尝试获取锁时发现死锁;尝试重启事务

对于这个命令:

INSERT INTO ClusterDescription (ClusterId, RightBarDateTime, InstrumentId)
 SELECT IFNULL(MAX(ClusterId) + 1, 1), :rightBarDateTime, :instrumentId
 FROM ClusterDescription WHERE InstrumentId = :instrumentId
  • 几乎同时可以有多达 50 个以上的 INSERT。
  • :instrumentId在任何并行命令中都不相同。
  • 检查进程列表,我看到许多这些命令等待执行的Time值 > 30 秒。
  • 我设置innodb_lock_wait_timeout为 360 秒,这改善了这种情况。在我收到很多上述错误和这个错误之前:

SQLSTATE[HY000]:一般错误:1205 超过锁定等待超时;尝试重启事务

我的问题:

  • 这个表定义有什么问题?

  • 为什么需要执行超过 50 秒的并行 INSERT 命令?

  • 为什么dead lock只有 1 个表受到影响时会收到错误消息?

在 MySQL 8.0.13 上运行

InnoDB由于降序索引,我需要引擎。

mysql deadlock
  • 1 个回答
  • 1912 Views
Martin Hope
Peter VARGA
Asked: 2018-04-08 06:34:16 +0800 CST

mysql_query() 没有使用 C API 将命令传递给 MySQL 服务器

  • 0

我问了这个问题,但经过更深入的调查后,我意识到悬挂不是问题所在。阅读此线程后,我决定提出一个新问题。

例如,我将这个字符串传递给mysql_query()函数:

SELECT 1

当我运行几千条这个命令时mysql_query(),命令没有提交到 MySQL 服务器!

我检查了 MySQL 日志文件,我简直不敢相信,但是命令不在那里,因此mysql_query()永远不会返回,因为它没有从服务器收到任何答复。

MySql 在执行之前将命令写入日志文件。我试过了SELECT SLEEP(10)。


笔记:

我知道,这确实意味着很多,但它在 SLES 11.3/XenServer 6.5 上工作了 3 年,没有任何问题。注意:这是一个 MCVE,它也不能正常工作!

自从我将它移至 SLES 12.3和XenServer 7.4 后,问题就开始了。

C++代码非常简单——我在写这个问题之前已经检查了3周。关键是这个问题在 ~10k 查询之后开始。VM 仍有约 3 GB 的空闲 RAM。


关于 MCVE 的注意事项:

我创建了一个MCVE,它适用于超过 500k 次的 MySQL 命令执行。

当我将此 MCVE 代码插入到我的项目中并评论我现有main()的代码以便从 MCVE 执行主要功能时,然后在几千次 [甚至只有数百次] 执行之后,MySQL 命令突然再次未提交到 MySQL 服务器。

更具体地说:在嵌入式 MCVE 运行之前,只有我的项目的静态对象被初始化。

对于这些静态初始化,这一定很奇怪,因为没有其他代码行在运行。


问题:

知道发生了什么事吗?尤其是命令显然 [我为什么要怀疑 MySQL 服务器日志文件] 没有从 C API 客户端提交到 MySQL 服务器这一事实真的让我很不安。


技术数据:

  • 作为 VM 在 XenServer 7.4 上运行的 SLES 12.3
  • gcc使用7.3编译,-std=c++17几乎每个警告选项。
  • 使用安装了所有 SLES 更新的默认 SLES 12.3 glibc 2.22。
  • 连接到 MySQL Community Server 5.7.21
  • C API 客户端 5.7.21
mysql myisam
  • 1 个回答
  • 387 Views
Martin Hope
Peter VARGA
Asked: 2016-07-31 06:57:09 +0800 CST

mysql 更新 sed:-e 表达式 #1,字符 17:“s”的未知选项

  • 0

运行 mysql rpm 时mysql-community-server-5.7.14-1.sles12.x86_64.rpm出现此错误:

sed:-e 表达式 #1,字符 17:“s”的未知选项

到目前为止一切正常,但我在更新后立即注意到有 712MB!系统磁盘上更少,我怀疑清理过程由于错误而无法正常工作。

我的问题:

  1. 有没有人知道如何解决这个问题,即使它是我直接从 MySQL 下载的 rpm 文件?
  2. 在哪里可以手动删除更新过程中创建的临时文件?

信息:

Linux:SLES 12 SP1

MySQL:5.7.14

澄清:

我不想知道这个问题在sed程序中意味着什么。我无权访问sed参数[我没有写;它由 MySQL 组织提供],因为它是rpm由 rpm 文件控制的程序运行的。

mysql
  • 1 个回答
  • 287 Views
Martin Hope
Peter VARGA
Asked: 2016-03-06 04:58:44 +0800 CST

MySQL Community Server 5.7.11 是否与 SLES 11 SP3 兼容?

  • 1

根据MySQL Community Server 的 MySQL 下载页面,只有二进制文件可用于SLES 12.

我的问题是 MySQL [及更高版本] 是否与我自己编译 MySQL 时Community Server 5.7.11兼容?SLES 11 SP3

mysql-5.7
  • 1 个回答
  • 151 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve