十五年测试老手,长期负责WEB\APP 项目测试,目前主要负责团队管理工作。
MySQL中创建及优化索引组织结构的思路
上一篇 /
下一篇 2011-06-06 22:01:59
/ 个人分类:mysql
通过一个实际生产环境中的数据存取需求,分析如何设计此存储结构,如何操纵存储的数据,以及如何使操作的成本或代价更低,系统开销最小。同时,让更多初学者明白数据存储的表上索引是如何一个思路组织起来的,希望起到一个参考模板的价值作用。51Testing软件测试网%?5\-rMu'R(O'lXcY
■ 测试用例描述
Q&z%m(J!Q9@?)m;|0 测试用例为B2C领域,一张用于存储用户选购物品而生成的产品订单信息表,不过去掉一些其他字段,以便用于测试,其表中的数据项也不特别描述,字段意思见表:51Testing软件测试网zR2R1`l Q
USE `test`;
DROP TABLE IF EXISTS `test`.`goods_order`;
CREATE TABLE `goods_order`(
`order_id` INT UNSIGNED NOT NULL COMMENT '订单单号',
`goods_id` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '商品款号',
`order_type` TINYINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '订单类型',
`order_status` TINYINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '订单状态',
`color_id` SMALLINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '颜色id',
`size_id` SMALLINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '尺寸id',
`goods_number` MEDIUMINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '数量',
`depot_id` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '仓库id',
`packet_id` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '储位code',
`gmt_create` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '添加时间',
`gmt_modify` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',
PRIMARY KEY(order_id,`goods_id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; 其中,主键信息:PRIMARY KEY(order_id,`goods_id`),为何主键索引索引字段的顺序为:order_id,`goods_id`,而不是: `goods_id`, order_id呢?原因很简单,goods_id在订单信息表中的重复率会比order_id高,也即order_id的筛选率更高,可以减少扫描索引记录个数,从而达到更高的效率,同时,下面即将会列出的SQL也告诉我们,有部分SQL语句的WHERE字句中只出现order_id字段,为此更加坚定我们必须把字段:order_id作为联合主键索引的头部,`goods_id`为联合主键索引的尾部。