重新设计自引用mysql表

时间:2012-07-12 14:07:07

标签: 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

1 个答案:

答案 0 :(得分:0)

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

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