MyISAM 用于将每个表存储在相应的文件中很方便。InnoDB 在很多方面都取得了进步,但我想知道为什么 InnoDB 将所有数据库存储在一个文件中(ibdata1默认情况下)。
我知道 InnoDB 将通过表的单个索引文件映射文件中数据的位置,但我不明白为什么它将所有数据混合在一个文件中。更重要的是,为什么要混合服务器上所有数据库的数据?
MyISAM 的一个有趣功能是,可以将数据库文件夹复制/粘贴到另一台机器上,然后使用该数据库(无需转储)。
有很多文章夸大了(当然恕我直言)对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的性能更好的效果呢?如果是,为什么?
在一个简单的投票系统中
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)
但是如何获取用户未投票的选举列表?
为两列或更多列创建复合主键时,例如PRIMARY KEY(col1, col2, col3);系统将INDEX每列单独?
我问这个问题的原因是,当我们使用 时UNIQUE INDEX (col1, col2, col3),它INDEX仅作为第一列,我们需要INDEX为其他列创建额外的s。我想知道复合主键是否也是这种情况。
我想制作一个触发器来记录任何更新的时间:
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列时,它也是另一个更新事件,它运行触发器。这将创建一个无限循环,这是行不通的。
如何将更新时间存储在相应的列中?
我希望使用触发器,因为表中有很多列。如果我尝试手动设置更新时间,则需要修改许多查询。
我用查询来计算记录
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遍历每一行时,它会处理所有计数,而无需一遍又一遍地扫描整个表。
我想捕捉 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.
考虑我们有大量的统计数据作为记录;例如 20-30INT列。将整个集合保存在一个表中是否更好,因为它们都属于一个记录或创建另一个以一对一关系连接的表。
前者的优点是避免JOIN并快速访问相应记录的所有统计数据。
后者的优点是保持柱子整洁。第一列是读密集型,第二列是写密集型。当然,我认为它对性能没有显着影响,因为我使用的是行级阻塞的 InnoDB。
一般来说,我想知道为单个记录分离不同的数据集是否实用?
mysql innodb normalization database-design relational-theory
在数据库结构中
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) LOAD DATA LOCAL INFILE默认情况下不启用。通常,它应该通过放置local-infile=1在my.cnf. 但它不适用于所有安装。根据我的经验,它适用于 Debian 7,但不适用于 Debian 7 minimum,尽管这两个安装都来自同一个预编译的 deb 包。两者都在 OpenVZ VPS 上。
如何调试为什么local-infile=1对安装不起作用,以及如何安全激活LOAD DATA LOCAL INFILE?