现在做一个多商家在线管理系统。
整体设计是这样:所有商家共用一个数据库里的所有表,每个表中有个字段epid来区别不同商家的信息!比如下面这张表:
CREATE TABLE `goods` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(10) NOT NULL,
  `epid` int(4) NOT NULL,
  PRIMARY KEY (`epid`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8用epid,id做了一个联合主键!
现在有个疑问:由于mysql 按主键进行聚集索引!也就是说所有epid相同的记录都会在磁盘上是物理相邻的是吗?
如果是这样的话,因为每个商家查询数据时肯定会加上epid这个字段来过滤不同商家的。假设goods这张表里几千万行数据了。包涵了数千个商家。由于epid是聚集索引。所以每次查询加上epid这个过滤条件。只要取一小块磁盘空间就可以得到这个商家的所有信息了。如果只是用自增ID做主键,epid不做为主键!只做普通索引!mysql就会按自增ID来做聚集索引,这样就会导致同一个商家下的记录就会分散地存放在磁盘上不连续位置上,即使epid有索引,这样查询就会频繁去定位不同位置,导致查询速度慢!不知道我样理解对不对~!如果对的话,还有一个问题。看了网上好多文章,都说mysql用自增主键好。因为在插入的时候就可以简单地插入到现有数据最后面!不用移动数据!而如果用上面的联合主键的话,因为主键相对来说比较随机!在插入的时候可以会频繁地移动数据。因为要按主键聚集索引!导致IO性能低下。所有说现在比较纠结了:不知道该如何是好!