我有一个大约五十万行的大表,这对共享主机服务器造成了影响。我想将这个大表拆分成3-4个较小的表,因为我们在共享主机环境中没有其他选项。在分解时,我会保留那个大表,并且只取出包含大量文本的特定列并将其拆分为较小的表。 我现在正在寻找的是一个解决方案,其中我必须对PHP代码进行最小的更改,并且表格可以分为几个,如下所示:
MAIN_TABLE
id | column1 | column2 | column3_just_pointer
smaller_table_1
id | main_table_id | column3
smaller_table_2
id | main_table_id | column3
smaller_table_3
id | main_table_id | column3
如果MySQL在执行select命令时有类似指针的指针可以指向较小表中的column3:从main_table中选择id,column3_just_pointer,我可以用上面提到的方式拆分表,前端PHP代码不需要是编辑完全。 我希望我听起来很清楚。这里有没有人知道是否以及如何实现这一目标?谢谢你的时间......
请注意:不能使用视图,因为它会阻止我创建多个较小的表。
答案 0 :(得分:0)
如果您正在进行垂直分区,则可以创建一个“合并”所有相关表的视图,因此应用程序根本不需要了解基础表。 例如,
TABLE main_table(id -PK, column list);
TABLE detail1 (main_id - PK,FK to main_table, column list);
TABLE detail2 (main_id - PK,FK to main_table, column list);
CREATE VIEW main_view AS
SELECT a.id, [columns from main_table], [columns from detail1, detail2, etc]
FROM maint_table a
LEFT JOIN detail1 b ON (b.main_id = a.id)
LEFT JOIN detail2 c ON (c.main_id = a.id)
现在可以针对select
完成所有应用main_view
。
答案 1 :(得分:0)
我最终完全使用small_table_1,smaller_table_2等名称对表进行水平分区,并在单独的表中保留每个表的起始和结束ID的记录,例如'main_table'。新数据仅添加到最后一个表中,当表格跨越40000行时,我的应用程序会自动创建一个新表small_table_n,并将该新表的信息放入main_table。
我在3月份问过这个问题,直到现在 - 7月,这个设置在我的3个网站中完美运行,我所有3个主机也很高兴网站没有占用他们服务器上的更多资源。