小编dr_*_*dr_的帖子

标量函数的交叉应用

我有这个:

SELECT
A
,B
,dbo.Func(C)
,dbo.Func(D)
,dbo.Func(E)
,F
FROM abcdef
WHERE
0 = dbo.Func(C) + dbo.Func(D)
Run Code Online (Sandbox Code Playgroud)

我读过这不是一个好的做法,因为该函数被调用了数百万次并且对性能产生了不良影响。

我试图用 CROSS APPLY 重写它:

SELECT *
 FROM abcdef
  CROSS APPLY dbo.Func(D) as FD
Run Code Online (Sandbox Code Playgroud)

但它返回此错误:

Invalid object name 'dbo.Func'
Run Code Online (Sandbox Code Playgroud)

我可以只在 TABLE VALUED 函数上使用 CROSS APPLY 吗?

CROSS APPLY 是否适用于标量函数(转换为表值函数)?因为在我的小型性能测试中,CROSS APPLY 有点慢。

sql-server cross-apply

8
推荐指数
1
解决办法
1万
查看次数

ALTER TABLE - ADD COLUMN 是否锁定表?

我有一个关于ALTER TABLE ... ADD COLUMNDDL 语句的问题。

在使用 MariaDB v10.2 的 Amazon RDS 实例上,我注意到INSERT语句完成并且行在表上完成SELECT之前正确插入表中(通过 验证)ALTER TABLE ... ADD COLUMN

ALTER TABLE操作完成之前,不应该将任何执行写入的 DML 语句排队吗?

我发布这个问题是因为我被要求执行一些测试来验证是否可以ALTER TABLE ... ADD COLUMN在工作时间内在实时生产数据库上运行,在频繁使用的数据库上,在有几百万行的表上运行——我觉得很不明智。即使ALTER TABLE没有在表上放置锁,它也必须等到任何连接不再使用该表(由于连接放置了元数据锁),这可能会在很久以后发生。
编辑:显然这个评估过于悲观。我一直在做几个测试,mysqlslap在表上执行繁重的操作 ( INSERT, UPDATE,DELETE语句和SELECT语句LIKE避免在ALTER TABLE ... ADD COLUMN运行时在 150 个模拟并发连接上使用索引;分析显示元数据锁定,但等待时间很短(每个 1 秒),表更改在大约 30 分钟内完成,而没有运行 SQL 语句时则需要 10 分钟。虽然这很令人满意,但另一方面,我想知道假设 DDL 语句是非阻塞的是否安全。

(可能值得注意的是InnoDB …

mariadb alter-table amazon-rds

8
推荐指数
1
解决办法
1万
查看次数

如何在 3 节点集群上运行 OPTIMIZE TABLE?

我有一个 3 节点 Percona XtraDB 集群,根据mysqlcheck,其中一些表已损坏(一些索引包含错误的条目数):

mydb.mytable
Warning  : InnoDB: Index 'foo' contains 1393929 entries, should be 1393918.
Warning  : InnoDB: Index 'bar' contains 1393921 entries, should be 1393918.
error    : Corrupt
Run Code Online (Sandbox Code Playgroud)

OPTIMIZE TABLE在集群上运行的最佳实践是什么?

我在没有用户的测试环境中做了一些实验,似乎OPTIMIZE TABLE一个节点上的an不会自动将其影响传播到其他节点。这与此命令修改索引和表的存储空间,而不是其内容或其定义的事实一致。

  • 在每个节点的生产环境中运行命令,让它在下一个节点中运行之前完成它可能有什么缺点?

  • 考虑到 MySQL(和 Percona XtraDB Cluster,据我所知)不支持分布式表锁,这对用户会有什么影响?这会使集群处于不一致的状态吗?

mysql optimization percona corruption xtradb-cluster

7
推荐指数
1
解决办法
3581
查看次数

字段 NOT NULL 和 DEFAULT NULL

这个 MySQL 表让我困惑了一会儿:

mysql> desc quux;
+---------------------------+-----------------------+------+-----+---------+----------------+
| Field                     | Type                  | Null | Key | Default | Extra          |
+---------------------------+-----------------------+------+-----+---------+----------------+
| foobar                    | int(11)               | NO   |     | NULL    |                |
(...)

mysql> show create table quux;
(...)
`foobar` int(11) NOT NULL,
(...)
Run Code Online (Sandbox Code Playgroud)

由于foobar从未使用 DEFAULT 子句创建该字段,因此它会自动分配 DEFAULT NULL。然而,乍一看,这似乎与它也被定义为 NOT NULL 的事实相矛盾。

然后我意识到这个模式旨在foobar在添加新记录时强制插入一个值(和一个非 NULL 值)。

这是一种可以接受的方法,还是有更好的方法?

mysql null mysql-5.6

7
推荐指数
1
解决办法
5583
查看次数

MySQL 中 CREATE 授权中的通配符

MySQL允许使用通配符数据库的名称,以允许用户在操作上的数据库的一个子集只:

GRANT ALL PRIVILEGES ON `foobar%`.* TO 'user'@'%' IDENTIFIED BY 'somepassword';
Run Code Online (Sandbox Code Playgroud)

有没有办法做同样的CREATE批,允许(参见上面的例子)user创建唯一的名字开始与数据库foobar

否则说:CREATE 授予是全局的(即允许具有此权限的用户创建任何数据库,而没有限制)还是可以以某种方式受到限制?

mysql permissions

6
推荐指数
1
解决办法
9157
查看次数

MySQL 设置有助于加快 mysqldump 导入

最近我不得不将 7 Gb MySQL 转储文件导入 MySQL 5.6 服务器。在具有 1 Gb RAM 的单核 CPU 上导入大约需要 7 个小时。

其他人在 MySQL 服务器上测试了导入,其中包括以下设置:

innodb_buffer_pool_size = 8G
query_cache_size = 300M
Run Code Online (Sandbox Code Playgroud)

我有点怀疑这些设置的相关性(是的,我什至认为设置如此大的查询缓存很糟糕)。这会有所作为吗?这些设置不是仅在查询数据库时使用,因此与导入无关吗?

如果是,应该设置哪些设置来加速大型转储文件的导入?

根据官方文档,这些值应该暂时设置:

unique_checks = 0
foreign_key_checks = 0
Run Code Online (Sandbox Code Playgroud)

我在这里读到它也应该设置

innodb_flush_log_at_trx_commit = 2
Run Code Online (Sandbox Code Playgroud)

但我认为这不会有帮助,因为默认情况下在 mysqldump 命令(--opt选项)中已禁用自动提交模式(每次插入时将日志刷新到磁盘)。

mysql innodb mysqldump import mysql-5.6

6
推荐指数
1
解决办法
1万
查看次数

MySQL 复制 - 从更新

我有一个 MySQL 的主从设置。如果我在从数据库中进行任何更改...

  1. 它会以任何方式破坏同步吗?
  2. 在下一次复制事件期间,更改会从主服务器上覆盖吗?
  3. 我可以使上述 (2) 选项发生吗?

mysql mysqladmin

5
推荐指数
1
解决办法
6607
查看次数

“mysqldump --all-databases”备份了哪些数据库?

哪些数据库包含在由生成的转储中mysqldump --all-databases

根据我的经验,这应该是所有用户创建的数据库,加上mysql数据库。information_schema仅在明确提及时才备份数据库,并且performance_schema从不备份。这样对吗?

mysql mysqldump backup information-schema

4
推荐指数
1
解决办法
4259
查看次数

损坏的 InnoDB 表、mysqlcheck 和 mysqldump 崩溃服务器

我管理一个 Percona XtraDB 集群,它使用一个带有摆动连接的网络存储。我们会定期遇到高 iowait 崩溃并以只读方式重新挂载 fs。不幸的是,目前还不能更换存储设备。

最近发现在运行mysqldump或mysqlcheck时,会导致节点上的MySQL服务器崩溃,报错 mysqlcheck: Got error: 2013: Lost connection to MySQL server during query when executing 'CHECK TABLE ... '

以下是mysqld.log崩溃期间的内容:

InnoDB: Error in pages 9479 and 9480 of index "PRIMARY" of table "foobar"."quux"
InnoDB: broken FIL_PAGE_NEXT or FIL_PAGE_PREV links
2015-09-28 14:39:45 7f015813b700 InnoDB: Page dump in ascii and hex (16384 bytes):

(...)

InnoDB: End of page dump
2015-09-28 14:39:45 7f015813b700 InnoDB: uncompressed page, stored checksum in field1 4038097986, calculated checksums for field1: …
Run Code Online (Sandbox Code Playgroud)

mysql innodb corruption

4
推荐指数
2
解决办法
2万
查看次数

具有空主机名的 MySQL 用户

在 MySQL 5.6 服务器上,该mysql.user表包含一个具有空主机名 ( 'jdoe'@'')的用户。这意味着什么?

mysql permissions mysql-5.6

4
推荐指数
1
解决办法
1141
查看次数

MySQL:'user'@'hostname' vs 'user'@'IPaddress'

我需要一个用户能够从机器 foobarhost,IP 10.11.12.13 登录我们的 MySQL 服务器 5.6。

因此我创建了一个用户,'joe'@'foobarhost'但他无法登录。我必须创建一个用户'joe'@'10.11.12.13',这次工作正常。

我的问题:MySQL 如何处理有关用户的主机名和 IP 地址?

MySQL在检查匹配之前对用户表进行排序,使用 IP 地址和主机名作为要匹配的最具体的值。但是,文档没有指定优先级 - 主机名或 IP。MySQL 是否尝试主机名解析,如果失败,则对 IP 执行检查?

用户表的推荐用法是什么:仅指定 IP 地址、主机名或两者(如我在上面的示例中所做的那样)?

mysql users

3
推荐指数
1
解决办法
4219
查看次数