小编Goo*_*bot的帖子

为什么 InnoDB 将所有数据库存储在一个文件中?

MyISAM 用于将每个表存储在相应的文件中很方便。InnoDB 在很多方面都取得了进步,但我想知道为什么 InnoDB 将所有数据库存储在一个文件中(ibdata1默认情况下)。

我知道 InnoDB 将通过表的单个索引文件映射文件中数据的位置,但我不明白为什么它将所有数据混合在一个文件中。更重要的是,为什么要混合服务器上所有数据库的数据?

MyISAM 的一个有趣功能是,可以将数据库文件夹复制/粘贴到另一台机器上,然后使用该数据库(无需转储)。

mysql innodb myisam mysqldump mysql-5.5

56
推荐指数
3
解决办法
7万
查看次数

为什么使用 innodb_file_per_table?

有很多文章夸大了(当然恕我直言)对innodb_file_per_table. 我知道使用innodb_file_per_table,应该可以更好地控制各个表;比如分别备份每张表。然而,对更好性能的要求是有问题的。

在我的测试中,在性能没有差异innodb_file_per_table,并ibdata1为60GB的数据库。当然,这是一个普通查询的简单测试,现实生活中复杂查询的情况可能会有所不同(这就是我问这个问题的原因)。64 位 linux 搭配ext4可以有效处理大文件。

使用innodb_file_per_table,需要更多的磁盘 I/O 操作;这在复杂的JOINs 和FOREIGN KEY约束中很重要。

表空间在 single 上共享ibdata;单独表的专用表空间如何节省磁盘空间?当然,使用 为每个表释放表空间更容易ALTER,但它仍然是一个昂贵的过程(带有表锁)。

问:是否innodb_file_per_table有关于MySQL的性能更好的效果呢?如果是,为什么?

mysql innodb performance linux

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

如何加入两个表以获取第二个表中缺失的行

在一个简单的投票系统中

CREATE TABLE elections (
election_id int(11) NOT NULL AUTO_INCREMENT,
title varchar(255),

CREATE TABLE votes (
election_id int(11),
user_id int(11),
FOREIGN KEYs
Run Code Online (Sandbox Code Playgroud)

为了获取用户投票的选举列表,使用以下 JOIN

SELECT * FROM elections
JOIN votes USING(election_id)
WHERE votes.user_id='x'
Run Code Online (Sandbox Code Playgroud)

但是如何获取用户未投票的选举列表?

join select

29
推荐指数
3
解决办法
18万
查看次数

mysql中复合主键上的INDEX如何?

为两列或更多列创建复合主键时,例如PRIMARY KEY(col1, col2, col3);系统将INDEX每列单独?

我问这个问题的原因是,当我们使用 时UNIQUE INDEX (col1, col2, col3),它INDEX仅作为第一列,我们需要INDEX为其他列创建额外的s。我想知道复合主键是否也是这种情况。

mysql index primary-key

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

UPDATE 后触发 UPDATE?

我想制作一个触发器来记录任何更新的时间:

CREATE TRIGGER col_update
AFTER UPDATE ON col
FOR EACH ROW BEGIN
UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id
END
Run Code Online (Sandbox Code Playgroud)

问题是当这个触发器尝试更新updated列时,它也是另一个更新事件,它运行触发器。这将创建一个无限循环,这是行不通的。

如何将更新时间存储在相应的列中?

我希望使用触发器,因为表中有很多列。如果我尝试手动设置更新时间,则需要修改许多查询。

mysql trigger update row-modification-time

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

如何在一个查询中进行多个计数?

我用查询来计算记录

SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%something%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%another%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%word%'
Run Code Online (Sandbox Code Playgroud)

对于每一个计数,mysql都需要遍历整个表,如果表很长,查询很多,这是一个大问题。

我想知道是否有一种方法可以在一个查询中进行所有计数。在这种情况下,当mysql遍历每一行时,它会处理所有计数,而无需一遍又一遍地扫描整个表。

mysql performance query count query-performance

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

如何使用 LIMIT 计算行数?

我想捕捉 X 行,因此,我设置了LIMIT X; 但是我怎样才能同时计算总行数呢?

目前,我使用两个单独的查询来这样做

SELECT COUNT(*) FROM col WHERE CLAUSE
SELECT * FROM col WHERE CLAUSE LIMIT X
Run Code Online (Sandbox Code Playgroud)

有没有办法在一个查询中做到这一点?

编辑:输出应该是col单元格和行数。实际上,选择col单元格后,它应该只走表格以进行计数。

我知道不可能合并这两个查询,因为第一个返回 1 行,但第二个返回 X 行。我很好奇 mysql 中是否有一个函数可以在LIMIT.

mysql count select mysql-5.5

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

一对一关系正常化了吗?

考虑我们有大量的统计数据作为记录;例如 20-30INT列。将整个集合保存在一个表中是否更好,因为它们都属于一个记录或创建另一个以一对一关系连接的表。

前者的优点是避免JOIN并快速访问相应记录的所有统计数据。

后者的优点是保持柱子整洁。第一列是读密集型,第二列是写密集型。当然,我认为它对性能没有显着影响,因为我使用的是行级阻塞的 InnoDB。

一般来说,我想知道为单个记录分离不同的数据集是否实用?

mysql innodb normalization database-design relational-theory

12
推荐指数
1
解决办法
8588
查看次数

如何在mysql中使用RESTRICT作为外键?

在数据库结构中

  CREATE TABLE Country (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE City (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE Map (
  country varchar(40) NOT NULL,
  city varchar(100) NOT NULL,
  PRIMARY KEY  (country,city),
  FOREIGN KEY (country) REFERENCES Country (name) ON DELETE CASCADE,
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

我希望City通过这三个相等的命令完整保留 child 中的相应值来删除 parent

  FOREIGN KEY (city) REFERENCES City (name) …
Run Code Online (Sandbox Code Playgroud)

mysql innodb foreign-key

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

在 mysql 中启用 LOAD DATA LOCAL INFILE

LOAD DATA LOCAL INFILE默认情况下不启用。通常,它应该通过放置local-infile=1my.cnf. 但它不适用于所有安装。根据我的经验,它适用于 Debian 7,但不适用于 Debian 7 minimum,尽管这两个安装都来自同一个预编译的 deb 包。两者都在 OpenVZ VPS 上。

如何调试为什么local-infile=1对安装不起作用,以及如何安全激活LOAD DATA LOCAL INFILE

mysql linux my.cnf configuration mysql-5.5

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