mysql - 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 万部电影。任何人都可以帮助我,我会很饱吗?
解决方案
您不需要分区。如果您使用 InnoDB 作为引擎并选择(movie_id, actor_id)
作为主键,则将根据数据库对行进行排列(通常,稍后会详细介绍)movie_id
并且非常容易找到数据库。
但是,基于的第二个搜索条件actor_id
必须扫描整个表(这很窄,没什么大不了的),但如果有人不想等待 1.5 秒,您可以在(actor_id, movie_id)
. 在这种情况下,索引将是表的精确副本,但根据actor_id
. 所以无论方向如何,数据库引擎都能快速定位到需要的记录。
即使对于将事物存储在堆中的数据库,B-Tree 索引的叶子(通常,稍后会详细介绍)根据键值排序,以便更快地找到合适的页面。
随着时间的推移,所有表/索引都会碎片化。令人惊讶的是,这并不像您想象的那样影响性能,但是如果您确实看到性能下降,您总是可以重建表/索引。商业数据库可以在线执行此操作,“免费”将要求您使数据库离线足够长的时间以重建表。较小的表/索引自然会花费更少的时间。
推荐阅读
- python - Kivy:如何使用 App 文件夹中的文本文件?
- python - Beautiful Soup scrape of table 正在返回字符串列表而不是列表列表
- html - 在绝对定位中使用 flex 在中心对齐项目
- node.js - 如何跟踪每个用户页面的活动连接数
- javascript - 如何检测 Chromecast SDK 中不支持的字幕轨道的加载
- azure-web-app-service - 在应用服务容器中使用 .net Core 3.0 实际上并不运行 3.0
- database - 检查某个数据库条目是否已存在于 DIesel/Rust 中
- actionscript-3 - 使用 actionscript 执行跨域请求的不一致
- sql - 在 spring data jpa 存储库中搜索许多可选参数
- java - 如何在 Java 中使用 drawString() 绘制任何文本