在我的一个 MySQL 数据库上创建一个简单的表需要永远:
mysql> CREATE TABLE blah (id BIGINT UNSIGNED NOT NULL PRIMARY KEY);
Query OK, 0 rows affected (16.58 sec)
Run Code Online (Sandbox Code Playgroud)
机器很闲:
01:21:26 PM CPU %user %nice %system %iowait %steal %idle
01:21:27 PM all 0.50 0.00 0.21 0.00 0.00 99.29
Run Code Online (Sandbox Code Playgroud)
任何想法如何调查这个?
编辑:按照DTest 的建议,这是执行配置文件:
mysql> SHOW PROFILE FOR QUERY 1;
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000044 |
| checking permissions | 0.000024 |
| creating table | 8.668129 |
| After create | …Run Code Online (Sandbox Code Playgroud) 我想向我的生产数据库之一中的 DB 字段添加唯一约束。不幸的是,以下语句阻塞了:
ALTER TABLE package ADD CONSTRAINT unique_package_id UNIQUE (package_id);
Run Code Online (Sandbox Code Playgroud)
注意:在需要在不长时间阻塞表更新的情况下添加新约束的情况下,使用现有索引添加约束会很有帮助。为此,请使用 CREATE INDEX CONCURRENTLY 创建索引,然后使用此语法将其安装为官方约束。请参阅下面的示例。
我试过:
CREATE UNIQUE INDEX CONCURRENTLY package_tmp_id_idx ON answer (package_id);
Run Code Online (Sandbox Code Playgroud)
其次是:
prod_db=> ALTER TABLE package ADD CONSTRAINT
unique_package_id UNIQUE (package) USING INDEX package_tmp_id_idx;
Run Code Online (Sandbox Code Playgroud)
哪个失败了:
ERROR: syntax error at or near "package_tmp_id_idx"
LINE 1: ...T unique_package_id UNIQUE (answer_id) USING INDEX package_tmp_id_idx...
^
Run Code Online (Sandbox Code Playgroud)
我试过使用语法,但无法让它工作。
使用现有 UNIQUE 索引创建 UNIQUE 约束的正确语法是什么?
我尝试使用存储过程来创建索引,但出现以下错误:
ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and
(utf8_unicode_ci,IMPLICIT) for operation '='
Run Code Online (Sandbox Code Playgroud)
没有行号或任何其他调试提示。
按照这个关于限制 PostgreSQL 中每个查询的资源的答案,我被建议为查询执行设置超时值:
SET statement_timeout TO '1min';
Run Code Online (Sandbox Code Playgroud)
这很好,但有时我想放宽对特定脚本的限制。
psql参数?我试过了psql --set statement_timeout=50,不成功。我创建了一个简单的存储过程:
mysql> CREATE FUNCTION hello (s CHAR(20))
-> RETURNS CHAR(50) DETERMINISTIC
-> RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected, 1 warning (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
但未能运行它:
mysql> SELECT hello('world');
ERROR 1370 (42000): execute command denied to user ''@'localhost' for routine 'test.hello'
Run Code Online (Sandbox Code Playgroud)
我的用户名可能是空字符串吗?如何创建用户并授予权限?我可以授予用户对数据库中所有实体的所有权限吗?
在 PostgreSQL 中显示表的列和约束是通过以下方式完成的:
\d+ <table_name>
Run Code Online (Sandbox Code Playgroud)
其中列出了表的列、数据类型和修饰符。
如何显示 Posgresql域的详细信息和约束?
如何索引to_char()列的 a ?
我试过了:
adam_db=> CREATE INDEX updates_hourly_idx
ON updates (to_char(update_time, 'YYYY-MM-DD HH24:00'));
Run Code Online (Sandbox Code Playgroud)
但是得到了错误:
错误:必须标记索引表达式中的函数
IMMUTABLE
这看起来很奇怪,因为to_char()时间戳是相当不可变的。
任何想法如何生成该索引?
我使用带有PostGIS的 PostgreSQL 9.3来存储位置更新。更新写入两个表 -location_updates和location_updates_history.
每个人都有:
car_idgeom 柱子每次更新都会写入location_updates表,然后触发器函数会将相同的更新写入location_updates_history. 更新后,除最新的 10 个更新外,所有更新都car_id将被删除。因此,该location_update表以移动窗口的方式包含了每辆车的最新 10 次更新,并且该location_updates_history表包含了它的完整历史记录。
我发现我只需要每辆车的最新更新,而不是最新的 10,所以我运行以下命令:
DROP TRIGGER location_update_insertion_trigger ON location_update;
DELETE FROM location_update WHERE id NOT IN
(SELECT max(id) FROM location_update GROUP BY cat_id);
ALTER TABLE location_update DROP COLUMN id CASCADE;
ALTER TABLE location_update ADD PRIMARY KEY (car_id);
Run Code Online (Sandbox Code Playgroud)
经过几个小时的工作,数据库处于完全锁定状态 - 非常糟糕,甚至其架构上的 pg_dump 也被阻止了。
在 …
考虑一个有几十个正常大小的表和一些大表的生产数据库。
我正在pg_dump为我自己的本地笔记本电脑寻找一种方便的方法来访问数据库内容,不包括几个大表。\COPY如果我偶尔需要处理这些表,我可以使用 轻松转储大表的小样本。
如果我使用 --exclude-table=table参数,则大表的架构和数据都将被省略,这会破坏在本地开发环境中期望这些表的查询。
有没有办法转储具有完整模式的数据库,不包括某些给定表的内容?
如何用逗号分隔每三位数字打印数字的整数部分?
例如,
12345 -> 12,345
1234.567 -> 1,234.567
Run Code Online (Sandbox Code Playgroud) mysql ×4
postgresql ×3
index ×2
performance ×2
collation ×1
deadlock ×1
domain ×1
encoding ×1
permissions ×1
pg-dump ×1
ubuntu ×1
users ×1
utf-8 ×1