mysql关系表分区

mysql关系表分区,mysql,database,database-design,bigdata,Mysql,Database,Database Design,Bigdata,向你们大家问好。 我有一张三张桌子,如下所示: 1-电影表: +----+-------------+ | id | movie_name | +----+-------------+ 2-演员表: +----+-------------+ | id | actor_name | +----+-------------+ +----------+-------------+ | movie_id | actor_id | +----------+-------------+

向你们大家问好。 我有一张三张桌子,如下所示:

1-电影表:

+----+-------------+
| id | movie_name  |
+----+-------------+ 
2-演员表:

+----+-------------+
| id | actor_name  |
+----+-------------+ 
+----------+-------------+
| movie_id | actor_id    |
+----------+-------------+
3-电影演员表:

+----+-------------+
| id | actor_name  |
+----+-------------+ 
+----------+-------------+
| movie_id | actor_id    |
+----------+-------------+
好的,我意识到如果我在电影表中有2000万部电影,而每部电影有20个演员,那么电影演员表应该有4亿行,即使我使用电影id和演员id的索引,对这个大表的查询也会很慢,因为在很长时间后,电影演员表中的行会非常非常大,比如10亿或更多。 然后我读了关于分区的内容。但是电影演员的划分对我来说是个问题。我想在这个表上基本上有两个查询:

要获取一个演员正在演的所有电影,请执行以下操作:

一,-

要让所有演员在电影中表演: 二,-


但是我不知道我应该在哪个列上,在什么条件下对这个数据库进行分区,而不会影响我的查询。有人能帮我吗?这对我来说非常重要。这是我为自己创建的一个测试,用于模拟真实世界的应用程序。我知道任何关于电影的应用程序都不会有2000万部电影。有人能帮我吗?我会很饱的?

你不需要分区。如果您使用InnoDB作为引擎,并选择
(movie\u id,actor\u id)
作为主键,则行将根据
movie\u id
进行排列(一般情况下,稍后会有更多内容),数据库很容易定位

但是,基于
actor\u id
的第二个搜索条件必须扫描整个表(这很窄,没什么大不了的),但是如果有人不想等待1.5秒,您可以在
(actor\u id,movie\u id)
上创建一个二级索引。在这种情况下,索引将是表的精确副本,但按照
actor\u id
组织。因此,无论方向如何,数据库引擎都能够快速找到所需的记录

即使对于以堆形式存储内容的数据库,B树索引的叶子(通常,稍后会详细介绍)也会根据键值进行排序,以便更快地找到适当的页面


随着时间的推移,所有表/索引都将出现碎片。令人惊讶的是,这对性能的影响并没有您想象的那么大,但是如果您确实看到性能下降,您总是可以重建表/索引。商业数据库可以在线执行此操作,“免费”将要求您将数据库脱机足够长的时间,以便重建表。较小的表/索引自然会花费较少的时间。

如果您在每行上发布问题,每行有16个字节处理8个id(假设它是bigint),那么您将获得更多有用的答案,因此即使您有2.5亿行,也只需几步就可以获得想要的id。如果您想对每一行进行anfd测试,那么您可以使用每个amounzt自动生成这样一个表,因为有很多列的大表是一个问题,而且硬件速度很慢。如果你需要来自常春藤的信息,mysql也会很快找到。试试吧,它涵盖了很多好东西。我同意不分割。我想补充一点,特别是对于4亿行,您应该遵循这里的提示:@N69S-serverfault是否一定比dba好。stackexchange?分区基本上是将一个大表划分为一个小表,每个表都有自己的索引副本,等等。这样会产生更多的开销,并且不会总是产生更好的性能。“每个都有自己的索引副本”——更具体地说,这些索引只针对分区中的行,而不是整个表。