所以我试图将一个主键添加到我的数据库中的一个表.现在它有一个这样的主键:
PRIMARY KEY (user_id, round_number)
Run Code Online (Sandbox Code Playgroud)
其中user_id是外键.
我想把它改成这个:
PRIMARY KEY (user_id, round_number, created_at)
Run Code Online (Sandbox Code Playgroud)
我在phpmyadmin中通过单击表结构视图中的主键图标来执行此操作.
这是我得到的错误:
#1025 - Error on rename of './database/#sql-2e0f_1254ba7' to './database/table' (errno: 150)
Run Code Online (Sandbox Code Playgroud)
它是一个带有InnoDB表引擎的MySQL数据库.
我们正在考虑使用UUID值作为MySQL数据库的主键.插入的数据是从数十台,数百台甚至数千台远程计算机生成的,并以每秒100-40,000次插入的速率插入,我们永远不会进行任何更新.
在我们开始剔除数据之前,数据库本身通常会达到大约50M的记录,因此不是一个庞大的数据库,但也不是很小.我们也计划在InnoDB上运行,但如果我们正在做的事情有更好的引擎,我们愿意改变它.
我们已准备好使用Java的Type 4 UUID,但在测试中已经看到了一些奇怪的行为.首先,我们将存储为varchar(36),现在我意识到我们最好使用二进制(16) - 尽管我不确定会有多好.
更大的问题是:当我们拥有50M记录时,这个随机数据对索引的影响有多大?如果我们使用例如最左边的位被加时间戳的1型UUID,我们会更好吗?或者我们应该完全抛弃UUID并考虑auto_increment主键?
我正在寻找关于不同类型的UUID在MySQL中作为索引/主键存储时的性能的一般想法/提示.谢谢!
我知道做这样的查询通常是一个坏主意:
SELECT * FROM `group_relations`
Run Code Online (Sandbox Code Playgroud)
但是,当我只想要计数时,我是否应该进行此查询,因为这样可以更改表但仍会产生相同的结果.
SELECT COUNT(*) FROM `group_relations`
Run Code Online (Sandbox Code Playgroud)
或者更具特色
SELECT COUNT(`group_id`) FROM `group_relations`
Run Code Online (Sandbox Code Playgroud)
我觉得后者可能会更快,但还有其他事情需要考虑吗?
更新:我在这种情况下使用InnoDB,抱歉没有更具体.
我环顾四周,发现一些MySQL引擎是innodb和MyISAM.也许还有更多.我的问题是这些数据库引擎是什么?
不同的MySQL引擎有什么区别?更重要的是,我如何决定使用哪一个?
我使用mysqldump导出数据库,如下所示:
mysqldump -u root -ppassword my_database > c:\temp\my_database.sql
Run Code Online (Sandbox Code Playgroud)
不知何故,它只导出一个表.有什么我做错了吗?
我正在尝试解析MySQL 文档.他们可以更清楚.他们似乎在说的是有五种可能性:SET NULL,NO ACTION,RESTRICT,CASCADE和SET DEFAULT.
NO ACTION和RESTRICT做同样的事情(防止任何破坏FK的DB更改)并且那个东西是默认的,所以如果省略ON DELETE子句你就说NO ACTION(或RESTRICT - 同样的事情).
SET NULL允许删除父行,将FK设置为NULL.
CASCADE删除子行.
应该永远不要使用SET DEFAULT.
这或多或少是正确的吗?
我正在使用MySQL的AUTO_INCREMENT字段和InnoDB来支持事务.我注意到当我回滚事务时,AUTO_INCREMENT字段没有回滚?我发现它是按照这种方式设计的,但有没有解决方法呢?
我想知道,如果它是用在InnoDB中可能MySQL有一个table与外键引用在不同的另一个表database?
如果是这样,如何做到这一点?
我有一组InnoDB表,我经常需要通过删除一些行并插入其他行来维护.其中一些表具有引用其他表的外键约束,因此这意味着表加载顺序很重要.要插入新行而不必担心表的顺序,我使用:
SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)
之前,然后:
SET FOREIGN_KEY_CHECKS=1;
Run Code Online (Sandbox Code Playgroud)
后.
加载完成后,我想检查更新表中的数据是否仍然保持参照完整性 - 新行不会破坏外键约束 - 但似乎没有办法做到这一点.
作为测试,我输入的数据确实违反了外键约束,并且在重新启用外键检查时,mysql没有产生任何警告或错误.
如果我试图找到一种方法来指定表加载顺序,并在加载过程中留在了外键检查,这不会让我在具有自引用外键约束的表加载数据,因此这将不是一个可接受的解决方案
有没有办法强制InnoDB验证表或数据库的外键约束?
我目前正致力于创建一个测试应用程序性能的环境; 我正在使用MySQL和InnoDB进行测试,以找出哪些可以为我们提供最佳服务.在此环境中,我们将自动准备数据库(加载现有转储)并检测我们的测试工具.
我准备用MySQL和InnoDB测试相同的数据转储,但我已经无法将初始导入带到InnoDB部分的可用速度.最初的转储需要更长时间,但这并不关心我:
$ for i in testdb_myisam testdb_innodb; do time mysqldump --extended-insert $i > $i.sql; done
real 0m38.152s
user 0m8.381s
sys 0m2.612s
real 1m16.665s
user 0m6.600s
sys 0m2.552s
Run Code Online (Sandbox Code Playgroud)
但是,导入时间差异很大:
$ for i in testdb_myisam testdb_innodb; do time mysql $i < $i.sql; done
real 2m52.821s
user 0m10.505s
sys 0m1.252s
real 87m36.586s
user 0m10.637s
sys 0m1.208s
Run Code Online (Sandbox Code Playgroud)
经过研究,我来了将表从MyISAM更改为InnoDB使系统变慢然后使用set global innodb_flush_log_at_trx_commit=2:
$ time mysql testdb_innodb < testdb_innodb.sql
real 64m8.348s
user 0m10.533s
sys 0m1.152s
Run Code Online (Sandbox Code Playgroud)
恕我直言仍然令人震惊的缓慢 我也禁用log_bin了这些测试,这里是所有mysql变量的列表. …
innodb ×10
mysql ×10
performance ×3
database ×2
foreign-keys ×2
mysqldump ×1
phpmyadmin ×1
sequence ×1
sql ×1
storage ×1
transactions ×1
uuid ×1