mysql - 重新设计一个自引用的 mysql 表

标签 mysql performance optimization recursion

我继承了一个遗留应用程序,它使用自引用表来促进层次结构。这会导致产生“难闻的气味”的递归方法调用。

parent_id列引用了同一张表的主键,这里大概有2500万条记录:

+-------------+---------+------+-----+---------+----------------+
| Field       | Type    | Null | Key | Default | Extra          |
+-------------+---------+------+-----+---------+----------------+
| phase_id    | int(10) | NO   | PRI | NULL    | auto_increment |
| plat_id     | int(10) | YES  | MUL | NULL    |                |
| name        | text    | YES  |     | NULL    |                |
| parent_id   | int(10) | YES  | MUL | NULL    |                |
| plan_id     | int(10) | YES  | MUL | NULL    |                |
+-------------+---------+------+-----+---------+----------------+

mysql> show table status like 'ref'\G
*************************** 1. row ***************************
Name: phase
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 25223658
Avg_row_length: 20
Data_length: 509450960
Max_data_length: 281474976710655
Index_length: 1026267136
Data_free: 0
Auto_increment: 25238013

我对这种结构有几个疑问:

  • 实现自引用表通常是不好的做法吗?我能想到的主要缺点是很难/不可能在单个查询中获得层次结构的最大深度,因为可能有 X 个子级。
  • 值得重新设计吗?拥有如此多的数据使得移动数据变得更加困难。
  • 我有哪些选择?我听说过一些表分区,但不知道它是否适合我的场景。

任何指针将不胜感激 ns

最佳答案

我们最终废弃了现有的自引用表。并创建了一个新表来容纳一个更简单的模型。

感谢 Sebas 的 Link多于。里面有很多好处!

关于mysql - 重新设计一个自引用的 mysql 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11453645/

相关文章:

mysql - mysql查询中如何提高查询速度

mysql - 在 MySQL 中使用 Utf-8 选择返回错误结果

.net - 低速网络,断线风险高

r - 求解 R 中的微分方程组

optimization - war 迷雾和二维网格

mysql - 添加到长而复杂的查询

php - 将值存储在数组内的精确索引中

asp.net - 如何预热 ASP.NET Web 应用程序,以便导航到时启动时间不会太长?

mysql - 如何使用 group by、where 和 order by 子句在大表(>38.700.000 行)上定义索引

当 SELECT 中存在多个字段时,mysql ORDER BY 不使用索引