小编Mic*_*wan的帖子

**NOT** 在 MySQL 中使用 MEMORY 存储引擎的原因是什么?

我最近发现 MySQL 有一个我不知道的“内存”引擎(我的大部分数据库工作都是针对业余项目的,所以我边走边学习我需要的东西)。似乎这个选项应该让我大大提高性能,所以我想知道它是否有任何缺点。我所知道的两个是:

  1. 我需要有足够的内存来保存有问题的表。
  2. 如果机器关闭,这些表就会丢失。

我相信 #1 不应该是一个问题,因为我使用的是 AWS EC2,并且可以根据需要移动到具有更多内存的实例类型。我相信我可以通过根据需要转储回磁盘来缓解 #2。

还有哪些问题?内存引擎能否提供比 MyISAM 或 InnoDB 更差的性能?我想我读过一些关于这个引擎的索引不同的东西;这是我需要担心的事情吗?

mysql storage-engine memory

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

为什么 MySQL 说我内存不足?

我试图INSERT...SELECT用 JDBC 在 MySQL 中执行一个相当大的,我得到以下异常:

Exception in thread "main" java.sql.SQLException: Out of memory (Needed 1073741824 bytes)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
Run Code Online (Sandbox Code Playgroud)

由于我实际上并没有返回 ResultSet 对象,因此我认为 Java 堆空间应该不是问题。但是,无论如何我都试图提高它,但没有任何好处。然后我尝试在 MySQL Workbench 中执行该语句,我得到了基本相同的结果:

Error Code 5: Out of memory (Needed 1073741816 bytes)
Run Code Online (Sandbox Code Playgroud)

我应该有足够的 RAM 来完成这些操作(足以容纳我从中选择的整个表格),但我猜我需要调整各种设置以利用我的所有内存。我正在使用Windows Server 2008 AMI运行 Amazon EC2高内存双超大实例。我尝试摆弄 my.ini 文件以使用更好的设置,但据我所知,我可能会让事情变得更糟。这是该文件的转储:

[client]
port=3306
[mysql]
default-character-set=latin1
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.5/"
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
character-set-server=latin1
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
query_cache_size=1024M
table_cache=256
tmp_table_size=25G
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_repair_threads = 2
myisam_sort_buffer_size=10G
key_buffer_size=5000M
bulk_insert_buffer_size = 4000M
read_buffer_size=8000M …
Run Code Online (Sandbox Code Playgroud)

mysql windows memory jdbc configuration

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

如何在 MySQL 中执行复杂的 GROUP BY?

我有一个表,其中包含进入其他表的几个键(其中每个键由多列组成)。我希望能够将具有相同键的行组合在一起,但我不想将所有行组合在一起。这不是一个简单GROUP BY的键,而是我希望能够分组说 10。所以如果一个特定的键出现 50 次,当我进行这个分组时我会得到 5 个结果(5 组,每组 10 个)。我还希望此分组在密钥内随机发生。

我不知道这样做的直接方法,而且我想出的迂回方法并没有像我认为的那样工作。我想出的迂回解决方案是为每个键创建一个新列,该列将是一个整数,以便值i表示该ith键的出现(但以随机顺序)。然后我可以进行整数除法,以便键中的每 n(比如 10)行具有相同的值,并且我可以GROUP BY对该值执行 a 。

有没有更直接的方法来完成我刚刚描述的事情?这很尴尬,我在创建新索引列时遇到了问题(正如我在这个问题中所描述的)。

编辑:首先请注意,这是针对 MySQL 的。如果我的目标不明确,我将添加一个示例。MySQL 文档显示了一种几乎可以到达的方法:

CREATE TABLE animals (
    grp ENUM('fish','mammal','bird') NOT NULL,
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (grp,id)
) ENGINE=MyISAM;

INSERT INTO animals (grp,name) VALUES
    ('mammal','dog'),('mammal','cat'),
    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;
Run Code Online (Sandbox Code Playgroud)

这将创建一个表,虽然不是我想要的,但它很接近:

+--------+----+---------+
| grp    | id | name …
Run Code Online (Sandbox Code Playgroud)

mysql order-by random

8
推荐指数
2
解决办法
7081
查看次数

如何让 MySQL 以随机顺序自动递增?

我有一个表,其中包含进入其他表的几个键(其中每个键由多列组成)。我想为每个键创建一个新列,该列将是一个整数,以便该值i表示该ith键的出现(但我希望该排序是随机的)。我想也许某种自动增量会起作用,但我有多个键,因此需要多列(我相信只允许一个自动增量)。

我想出的解决方案似乎不起作用。首先,我创建了一个新表来存储我感兴趣的列,以及一个额外的列rnd. 我rnd稍后会ORDER BY rand()在需要实际列而不是函数的上下文中使用。这是我如何完成第一点:

SET @rnd = 0;
INSERT INTO new_table SELECT col1, ..., colN, @rnd := @rnd+1 FROM original_table ORDER BY rand();
Run Code Online (Sandbox Code Playgroud)

接下来,我将根据键添加一个自动增量,并使用rnd我刚刚创建的列。在ALTER TABLE...ORDER BY不通过函数(如允许排序rand()),所以这就是为什么我需要创建的rnd第一列:

ALTER TABLE new_table ADD first_index INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD KEY(col1, col2, first_index), ORDER BY rnd;
Run Code Online (Sandbox Code Playgroud)

然后我会删除自动增量状态并为每个键重复:

ALTER TABLE new_table MODIFY COLUMN first_index INT UNSIGNED NOT NULL;
Run Code Online (Sandbox Code Playgroud)

起初,这似乎奏效了。然而,仔细检查后,似乎没有遵守随机排序。索引列的创建顺序与原始表碰巧使用的顺序相同。当我经历了几个非常尴尬的步骤以确保随机排序时,我感到相当沮丧,而这甚至不起作用。为什么我的解决方案不起作用,有没有更优雅的方法来做到这一点?

编辑:显然我不清楚我在找什么,所以我会尝试一个简单的例子:

Col1   Col2   <other columns>
1997 …
Run Code Online (Sandbox Code Playgroud)

mysql order-by auto-increment random

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