MySQL - INNER JOIN 12个包含LIMIT 30或创建视图或非规范化的表?

时间:2018-04-19 12:44:45

标签: mysql performance

我正在使用MySQL,规范化表用于所有交易。

现在,我需要将数据作为Log获取,但是需要加入超过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 ?

有时我们需要确保使用规范化保存存储,有时我们需要更快的性能。 (但仍然不想使用非规范化数据进行日志,因为数据大小)。

任何解决方案?谢谢。

1 个答案:

答案 0 :(得分:2)

我依赖。

  • VIEW只是语法糖。它没有提供额外的性能。但是,可能使您的SQL更易于阅读。

  • 去国有化可能帮助。重新制定可以帮助。更重要的是,将首先集中在找到30行可能来帮助。 然后处理JOINs的其余部分。 (如果没有查看查询,我就不能更具体,包括哪些列在哪些表中。)

  • 如果您受I / O限制,SSD将帮助。有数千行,您不太可能受I / O限制。一百万行可能看到差异。 (需要更多信息来详细说明。)

  • 请勿规范化“连续”值,例如FLOATsDATETIMEs。很可能使“范围”测试效率低下。 More discussion.

  • 请提供SHOW CREATE TABLEEXPLAIN SELECT ...

  • ENUMs有时是节省空间避免规范化的好方法。