数据表设计与多列PRIMARY键MySQL

时间:2011-06-29 16:36:31

标签: mysql database-design indexing

任何人都可以立即在下面的架构中看到问题或瓶颈吗?读取是90%的操作,但我想知道我是否在写作的任何地方拍摄自己。

提案

每个对象(另一个表中的行)都可以与其他对象相关联。每个关系对只能有一条记录(对是方向敏感的,因此XY 可以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) 进行选择 - 因为它不在索引之后,是否会被使用?如果没有,是否会在其上添加单独的索引会导致写入的大量开销?

1 个答案:

答案 0 :(得分:1)

b_id上添加第二个索引的优势将超过写入的任何开销,因为如果没有索引,则需要执行全表扫描以按b_id进行过滤。

只在b_idb_id, a_id上建立索引取决于表引擎,因为InnoDB将主键存储在辅助索引中,但是MyISAM