考虑一个值和哈希表,如下所示:
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| val | char(9) | NO | | NULL | |
| val_hashed | char(50) | YES | | NULL | |
+------------+----------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
以下查询在 0.00 秒内完成:
SELECT * FROM hashes ORDER BY 1 DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
但是,此查询需要 3 分 17 秒:
SELECT val FROM hashes ORDER BY 1 DESC LIMIT 1; …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将 MySQL 表中的数据输出到文件,但出现权限错误:
$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>
Run Code Online (Sandbox Code Playgroud)
如果有问题的目录被chmodded为777,那么为什么MySQL用户不能写入文件?有趣的是,我也不能写入 /tmp/。
编辑: 看起来数据库用户具有适当的 MySQL 权限:
mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for gs@localhost |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword' |
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost' |
+----------------------------------------------------------------------------------+
2 rows …
Run Code Online (Sandbox Code Playgroud) 在全新的 Kubuntu 14.04 安装中,我运行了sudo aptitude install mysql-server-core-5.6
. 由于某些 KDE 软件包依赖于mysql-server-core-5.5
,安装无法完成,这些软件包将被替换。现在,当我运行时,sudo aptitude install mysql-server-5.5
在指定密码后出现此错误:
Configuring mysql-server-5.5
Unable to set password for the MySQL "root" user
An error occurred while setting the password for the MySQL administrative user. This may have happened
because the account already has a password, or because of a communication problem with the MySQL server.
You should check the account's password after the package installation.
Please read the /usr/share/doc/mysql-server-5.5/README.Debian file for more …
Run Code Online (Sandbox Code Playgroud) 鉴于关于允许在 dba.SE上使用基本 SQL 问题的 Meta 讨论,我提出了一个我现在遇到的问题,对此 Stack Overflow 上的答案是不充分和幼稚的。我希望有比 SO 上提出的问题更好的解决方案(因为我目前在应用程序中面临这个问题),而 dba.SE 似乎是找到更好答案的理想场所。
这是 Stack Overflow 上的原始问题:如何从 mysql 中选择每个第 n 行?
这是公认的答案:
SELECT *
FROM (
SELECT
@row := @row +1 AS rownum, [column name]
FROM (
SELECT @row :=0) r, [table name]
) ranked
WHERE rownum % [n] = 1
Run Code Online (Sandbox Code Playgroud)
接受的答案的关键问题是它需要将整个表拉到一个临时表中。因此,我已经在这个问题的标题中解决了这个问题。
还要考虑该表可能已删除行,因此仅对WHERE MOD
主键进行测试的替代查询也不是一个好的解决方案。Id est,不能相信主键是连续的。
有没有更好的方法来表达查询,该查询将返回每第二、第十或任意第 n 行,它不需要将整个表拉入内存但也考虑已删除的行?
每个第 n 行都可以定义为:
n = 2: Rows 0, 2, …
Run Code Online (Sandbox Code Playgroud) 考虑以下查询:
mysql> SELECT count(*) FROM list l WHERE l.source='blink';
+----------+
| count(*) |
+----------+
| 3372 |
+----------+
1 row in set (0.00 sec)
mysql> SELECT count(*) FROM list l LEFT JOIN cardinal c ON l.id=c.id WHERE c.resolution IN ('Left','Right','Up') AND l.source='blink';
+----------+
| count(*) |
+----------+
| 5116 |
+----------+
1 row in set (2.47 sec)
Run Code Online (Sandbox Code Playgroud)
INSERT
在这两个运行的查询之间没有在数据库上运行或运行其他查询。第二个查询似乎比第一个查询更严格,那么它怎么会返回更多的行呢?请注意,该list
表有超过 200 万行,而该cardinal
表大约有 50 万行。
编辑:添加EXPLAIN
输出:
mysql> EXPLAIN SELECT count(*) FROM …
Run Code Online (Sandbox Code Playgroud) 我有一个大约有 1700 万行的表:
mysql> describe humans_we_respect;
+---------------------+-------------------------------------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+-------------------------------------------------------------------------+------+-----+---------+-------+
| id | bigint(20) | NO | PRI | NULL | |
| name | varchar(63) | YES | | NULL | |
| address | varchar(127) | YES | | NULL | |
| city | varchar(63) | YES | | NULL | |
| state | varchar(3) | YES | MUL | NULL | |
| zip …
Run Code Online (Sandbox Code Playgroud) 我有一个特定的表,我无法为其添加密钥:
mysql> ALTER TABLE tasks ADD KEY `fruitful_user_count` (`user_id`, `is_fruitful`);
ERROR 1034 (HY000): Incorrect key file for table 'tasks'; try to repair it
Run Code Online (Sandbox Code Playgroud)
谷歌搜索这个问题似乎这个问题通常是配置问题或磁盘空间问题。事实上,这个数据库运行在一个Amazon RDS实例上,这意味着它基本上是一个专用于MySQL的托管服务器,配置非常标准。此外,分配给我们的磁盘只有大约 25% 已满。
考虑到可能虚拟机上的磁盘(我相信由 Xen 提供支持)已满,而不是我分配的磁盘空间,甚至可能不在同一个房间(网络存储)中,我重新启动了 RDS 实例,希望我能得到另一个 VM 上的新实例。然而,这并没有帮助。
我的下一个故障排除步骤应该是什么?
这是表:
mysql> show create table tasks;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tasks | CREATE TABLE `tasks` (
`user_id` char(32) NOT NULL,
`module_id` int(11) NOT NULL DEFAULT '0',
`is_successful` tinyint(1) DEFAULT NULL,
`is_fruitful` tinyint(1) DEFAULT NULL,
`last_run` timestamp …
Run Code Online (Sandbox Code Playgroud) 这篇非常有用的文章解释了有关MySQL 枚举行为的一些奇怪之处:http : //melp.nl/2009/05/mysql-enums-and-booleans/
没有关于为什么存在这种行为的讨论。此外,在谷歌搜索这个主题时,我发现只有相互矛盾的信息和推测,由“博主”和其他盲人引导。
有人可以描述一下为什么 MySQL 枚举会遭受帖子中概述的行为。这是帖子中介绍的 Enum 奇怪之处的一个示例,但还有更多示例:
mysql> insert into t values('1'),('0');
mysql> select b,b=1,b=0 from t;
+---+-----+-----+
| b | b=1 | b=0 |
+---+-----+-----+
| 1 | 0 | 0 |
| 0 | 1 | 0 |
+---+-----+-----+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud) 我在AWS RDS 中型实例上有一个大型 MySQL 数据库表(约 100 万行并且还在增长):
mysql> describe clients;
+-----------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(500) | YES | | NULL | |
| address | varchar(500) | YES | | NULL | |
| city | varchar(200) | YES | | NULL | |
| state | varchar(100) | YES | …
Run Code Online (Sandbox Code Playgroud) mysql ×7
alter-table ×1
amazon-rds ×1
enum ×1
errors ×1
explain ×1
join ×1
linux ×1
mysql-5.5 ×1
optimization ×1
performance ×1
permissions ×1
select ×1
update ×1