首页 > 解决方案 > mysql关系表分区

问题描述

大家好。我有一个如下三表:

1-电影表:

+----+-------------+
| id | movie_name  |
+----+-------------+ 

2-演员表:

+----+-------------+
| id | actor_name  |
+----+-------------+ 

3-电影演员表:

+----------+-------------+
| movie_id | actor_id    |
+----------+-------------+

好的,我意识到如果我在电影表中有 2000 万部电影并且每部电影有 20 位演员,那么电影演员表应该有 4 亿行,即使我使用电影 ID 和演员 ID 上的索引,对这个大表的查询也会很慢,因为很长一段时间后,movie_actor 中的行将非常大,例如 10 亿甚至更多。然后我阅读了有关分区的内容。但是对movie_actor进行分区对我来说是一个问题。我想在这个表上基本上有两个查询:

获取一位演员正在出演的所有电影:

1-

`select movie_id from movie_actor where actor_id = 102547;`

让所有在电影中表演的演员:2-

`select actor_id from movie_actor where movie_id = 200145364;`

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

标签: mysqldatabasedatabase-designbigdata

解决方案


您不需要分区。如果您使用 InnoDB 作为引擎并选择(movie_id, actor_id)作为主键,则将根据数据库对行进行排列(通常,稍后会详细介绍)movie_id并且非常容易找到数据库。

但是,基于的第二个搜索条件actor_id必须扫描整个表(这很窄,没什么大不了的),但如果有人不想等待 1.5 秒,您可以在(actor_id, movie_id). 在这种情况下,索引将是表的精确副本,但根据actor_id. 所以无论方向如何,数据库引擎都能快速定位到需要的记录。

即使对于将事物存储在堆中的数据库,B-Tree 索引的叶子(通常,稍后会详细介绍)根据键值排序,以便更快地找到合适的页面。

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


推荐阅读