我有这个:
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 有点慢。
我有一个关于ALTER TABLE ... ADD COLUMN
DDL 语句的问题。
在使用 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 …
我有一个 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 表让我困惑了一会儿:
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允许使用通配符数据库的名称,以允许用户在操作上的数据库的一个子集只:
GRANT ALL PRIVILEGES ON `foobar%`.* TO 'user'@'%' IDENTIFIED BY 'somepassword';
Run Code Online (Sandbox Code Playgroud)
有没有办法做同样的CREATE批,允许(参见上面的例子)user
来创建唯一的名字开始与数据库foobar
?
否则说:CREATE 授予是全局的(即允许具有此权限的用户创建任何数据库,而没有限制)还是可以以某种方式受到限制?
最近我不得不将 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 的主从设置。如果我在从数据库中进行任何更改...
哪些数据库包含在由生成的转储中mysqldump --all-databases
?
根据我的经验,这应该是所有用户创建的数据库,加上mysql
数据库。information_schema
仅在明确提及时才备份数据库,并且performance_schema
从不备份。这样对吗?
我管理一个 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 5.6 服务器上,该mysql.user
表包含一个具有空主机名 ( 'jdoe'@''
)的用户。这意味着什么?
我需要一个用户能够从机器 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 ×9
mysql-5.6 ×3
corruption ×2
innodb ×2
mysqldump ×2
permissions ×2
alter-table ×1
amazon-rds ×1
backup ×1
cross-apply ×1
import ×1
mariadb ×1
mysqladmin ×1
null ×1
optimization ×1
percona ×1
sql-server ×1
users ×1