我正在使用 MySQL,所有事务的规范化表。
现在,我需要获取数据作为日志,但它需要加入超过 12 个表来记录我们需要查看的所有数据,只有最后 30 个提交的数据(完成/拒绝)将显示在分页中(日志页面 1)但仍然有下一个最后 30 个分页。
9 INNER JOIN
3 LEFT JOIN (It's Admin Order Form when customer Ordering via Offline (friend))
WHERE order_status = 1 OR order_status = 2 (done & reject)
ORDER BY order_date DESC
LIMIT 30 (limiting 30 per page with pagination)
The order data is more than 2.000.000 rows for 4 tables in INNER JOIN connected in PK & FK.
如果我加入 12 个表或我应该做其中的 1 个,有什么问题吗?
1. Create View in MySQL
**OR**
2. Denormalize data (Create 1 more table for order_log), but I think it would
cost so many storage size
**OR**
3. Using SSD ?
有时我们需要确保通过规范化节省存储空间,有时我们需要更快的性能。 (但仍然不想使用非规范化数据作为日志,因为数据大小)。
有什么解决办法吗?谢谢。
最佳答案
视情况而定。
VIEW 只是语法糖。它不提供额外的性能。但是,它可能使您的 SQL 更易于阅读。
剥夺国籍可能有帮助。重新制定可能会有所帮助。更重要的是,首先专注于查找 30 行可能会有所帮助。 然后 处理剩余的JOIN。 (如果没有看到查询,我不能更具体,包括哪些列在哪些表中。)
如果您受 I/O 限制,SSD 将提供帮助。对于数千行,您不太可能受 I/O 限制。一百万行可能会发现差异。 (需要更多信息才能详细说明。)
不要规范化“连续”值,例如 FLOATs 或 DATETIMEs。这很可能使“范围”测试效率低下。 More discussion.
请提供SHOW CREATE TABLE,EXPLAIN SELECT ...
ENUM 有时是节省空间和避免规范化的好方法。
关于MySQL - INNER JOIN 12 Tables with LIMIT 30 or Create View or Denormalization?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49921480/