任何人都可以立即在下面的架构中看到问题或瓶颈吗?读取是90%的操作,但我想知道我是否在写作的任何地方拍摄自己。
提案
每个对象(另一个表中的行)都可以与其他对象相关联。每个关系对只能有一条记录(对是方向敏感的,因此X
到Y
可以与Y
共存到{{1 }})。
X
典型的请求是获取所有相关的对象(对于给定的对象+-------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+----------------+
| a_id | bigint(20) unsigned | NO | PRI | NULL | |
| b_id | bigint(20) unsigned | NO | PRI | NULL | |
+-------+---------------------+------+-----+---------+----------------+
):
A
使用UI中的简单复选框数组管理关系。为了保存关系,我将计算当前集合中已检查/未检查的对象之间的差异(对象将在UI中进行分页),然后相应地插入/删除;
SELECT * FROM objects INNER JOIN relations ON id = b_id WHERE a_id = A
我可能还需要查询反向关系,仅使用DELETE FROM relations WHERE a_id = A AND b_id IN(B,C)
# if these relations already exist, will fail silently
INSERT IGNORE INTO relations (a_id, b_id) VALUES (A,D), (A,E)
进行选择 - 因为它不在索引之后,是否会被使用?如果没有,是否会在其上添加单独的索引会导致写入的大量开销?
答案 0 :(得分:1)
在b_id
上添加第二个索引的优势将超过写入的任何开销,因为如果没有索引,则需要执行全表扫描以按b_id
进行过滤。
只在b_id
或b_id, a_id
上建立索引取决于表引擎,因为InnoDB
将主键存储在辅助索引中,但是MyISAM
不