18 条回复  ·  469 次点击
hackhu2019 小成 2024-8-7 09:10:40
我的想法是脚本生成 3 张表对应的 SQL 语句,至于表数据之间的关联关系在生成 SQL 文件的时候就处理好,然后数据库直接执行 SQL 文件,即使几千万的数据应该也是一小时内就搞定了
treblex 小成 2024-8-7 09:26:36
laravel 对这块的定义是 seeding 吧,其他的框架很少见做这个的
非要用 gpt 的话,你要先告诉他怎么定义数据,让他生成有关系的结构化数据给你,然后再转 sql
encro 小成 2024-8-7 10:10:20
mysql 通过存储过程以及事务批量生成数据

https://c4ys.com/archives/858

很早的一篇文章了,希望对你有用
pkoukk 小成 2024-8-7 10:10:46
一天写 1000W 行,每秒写入才 115 ,4c8g 的虚机应该都扛得住,没啥好测的
测查询性能,自己写个两段代码写个百八十万行,explain 一下查询语句,看看索引使用正不正确就完事了
剩下的事情,就算要调优也不是你考虑的
rlds 小成 2024-8-7 10:18:14
你这个需求,navicat 完全能胜任了。
MoYi123 小成 2024-8-7 10:25:31
几天时间能写入一千万行, 还要考虑利用硬件?
不搞特殊优化的测试数据导入速度是 1 秒 10-20 万. 一千万也就 1 分钟左右.
meeop 小成 2024-8-7 12:35:58
1 这个事不适合拿存储过程干,让 ai 写脚本,比如用 python 写,其中 python 可以不直接操作数据库,而是生成 sql,然后你只要导入生成的 sql,导入数据是非常快的,一秒应该能导入 1-10w 行,1000w 行数据也就是 2 分钟,你可以反复折腾

2 看你的需求,无非是给内容挂标签然后测试关联查询性能
这没啥好测试的,这数据关系型数据库最基础能力,只要加好索引,确认执行计划使用索引即可
zouri 小成 2024-8-7 12:59:46
https://github.com/joke2k/faker ,python
h0099 小成 2024-8-7 17:27:40
首先 19 个月过去了阁下还在折腾这个 https://en.wikipedia.org/wiki/Many-to-many_(data_model) 关系的 https://en.wikipedia.org/wiki/Associative_entity ?并试图继续滥用`提前优化` https://z.n0099.net/#narrow/near/93295 思维精神?
/t/908231
/t/908246
/t/909074

> 要么就是写入过程可以暂停和恢复,这个应该是没法实现的吧?

why not? 合理假设您是在 https://en.wikipedia.org/wiki/Cunningham's_Law

> 分段写入也可以,通过参数决定写入多少

这跟前面的可暂停本质上是一样的

> 写入速度越快越好,最好可以最大化利用 SSD

建议直接`LOAD csv` https://dev.mysql.com/doc/refman/8.4/en/load-data.html
并在写入前后开关 redolog https://dev.mysql.com/doc/refman/8.4/en/innodb-redo-log.html#innodb-disable-redo-logging

> 最好是几天时间能写入一千万行吧。如果没必要的话更少也可以。

一千万行?一千万亿行!

---
```sql
CREATE TABLE tag_content_rel(
rel_id INT PRIMARY KEY AUTO_INCREMENT,
tag_id INT NOT NULL,
content_id INT NOT NULL);
```
为什么不`UNIQUE(tag_id, content_id)`?还是说您的确需要允许出现重复的`(tag_id, content_id)`对?

> 我猜如果位置是有规律的可能查询性能会更好

对于将 PK 用做 clustered index (详见 https://github.com/n0099/open-tbm/issues/48#issuecomment-2091811880 的`12.1`)的 mysql innodb storage engine 中的表`tag_content_rel`只有`PRIMARY KEY(rel_id, tag_id, content_id)`后才会符合您的假设
12
返回顶部