mysql索引组织结构_MySQL中创建及优化索引组织结构的思路

通过一个实际生产环境中的数据存取需求,分析如何设计此存储结构,如何操纵存储的数据,以及如何使操作的成本或代价更低,系统开销最小。同时,让更多初学者明白数据存储的表上索引是如何一个思路组织起来的,希望起到一个参考模板的价值作用。51Testing软件测试网GE};X

])adD0TY(^*_b^0

测试用例为B2C领域,一张用于存储用户选购物品而生成的产品订单信息表,不过去掉一些其他字段,以便用于测试,其表中的数据项也不特别描述,字段意思见表:.X.kl,UIB0

None.gifUSE`test`;

None.gifDROPTABLEIFEXISTS`test`.`goods_order`;

None.gifCREATETABLE`goods_order`(

None.gif`order_id`INTUNSIGNEDNOTNULLCOMMENT'订单单号',

None.gif`goods_id`INTUNSIGNEDNOTNULLDEFAULT'0'COMMENT'商品款号',

None.gif`order_type`TINYINTUNSIGNEDNOTNULLDEFAULT'0'COMMENT'订单类型',

None.gif`order_status`TINYINTUNSIGNEDNOTNULLDEFAULT'0'COMMENT'订单状态',

None.gif`color_id`SMALLINTUNSIGNEDNOTNULLDEFAULT'0'COMMENT'颜色id',

None.gif`size_id`SMALLINTUNSIGNEDNOTNULLDEFAULT'0'COMMENT'尺寸id',

None.gif`goods_number`    MEDIUMINT  UNSIGNEDNOTNULLDEFAULT'0'COMMENT'数量',

None.gif`depot_id`INTUNSIGNEDNOTNULLDEFAULT'0'COMMENT'仓库id',

None.gif`packet_id`INTUNSIGNEDNOTNULLDEFAULT'0'COMMENT'储位code',

None.gif`gmt_create`TIMESTAMPNOTNULLDEFAULT'0000-00-00 00:00:00'COMMENT'添加时间',

None.gif`gmt_modify`TIMESTAMPNOTNULLDEFAULT'0000-00-00 00:00:00'COMMENT'更新时间',

None.gifPRIMARYKEY(order_id,`goods_id`)

None.gif)ENGINE=InnoDB AUTO_INCREMENT=1CHARACTERSET'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`为联合主键索引的尾部。+lq.Z aJ}"E!U;v7i0

数据存储表设计的小结:'O9h dV hd[0

设计用于存储数据的表结构,首先要知道有哪些数据项,也即行内常说的数据流,以及各个数据项的属性,比如存储的数据类型、值域范围及长度、数据完整性等要求,从而确定数据项的属性定义。存储的数据项信息确定之后,至少进行如下三步分析:51Testing软件测试网XIah*Xr`OQ

● 首先,确定哪些数据项或组合,可以作为记录的唯一性标志;51Testing软件测试网5[9D_\z'RBW l

● 其次,要确定对数据记录有哪些操作,每个操作的频率如何,对网站等类型应用,还需要区分前台操作和后台操作,也即分外部用户的操作,还是内部用户的操作;2?JMSc%~fE F0

● 最后,对作为数据记录操作的条件部分的数据项,分析其数据项的筛选率如何,也即数据项不同值占总数据记录数的比例关心,比例越接近1则是筛选率越好,以及各个值得分布率;^d&T

c-oy&FQ0

综上所述,再让数据修改性操作优先级别高于只读性操作,就可以创建一个满足要求且性能较好的索引组织结构。51Testing软件测试网c+iv

F\

数据的存取设计,就涉及一块非常重要的知识: 关系数据库的基础知识和关系数据理论的范式。对于范式的知识点,特别解释下,建议学到BCNF范式为止,1NF、2NF、3NF和BCNF之间的差别,各自规避的问题、存在的缺陷都要一清二楚,但是在真实的工作环境中,不要任何存取设计都想向范式靠,用一句佛语准确点表达:空即是色,色即是空。qWA.Gm`7b a0

■ 用于生成测试数据的存储过程代码51Testing软件测试网KL6]\.q x

创建索引,就离不开表存储的真实数据,为此编写一个存储过程近可能模拟真实生产环境中的数据,同时也方便大家使用此存储过程,在自己的测试环境中,真实感受验证,(Bb5i"p9yo4op@'A0

存储过程代码:51Testing软件测试网]4Rnp_y&W4R[

None.gifDELIMITER $$

None.gifDROPPROCEDUREIFEXISTS`usp_make_data` $$

None.gifCREATEPROCEDURE`usp_make_data`()

None.gifBEGINNone.gifDECLAREiv_goods_idINTUNSIGNEDDEFAULT0;

None.gifDECLAREiv_depot_idINTUNSIGNEDDEFAULT0;

None.gifDECLAREiv_packet_idINTUNSIGNEDDEFAULT0;

None.gif    

None.gifSETiv_goods_id=5000;

None.gifSETiv_depot_id=10;

None.gifSETiv_packet_id=20;

None.gif    

None.gifWHILEiv_goods_id>0None.gif    DO

None.gif     STARTTRANSACTION;

None.gifWHILEiv_depot_id>0None.gif      DO

None.gifWHILEiv_packet_id>0None.gif        DO

None.gifINSERTINTOgoods_order(order_id,goods_id,order_type,order_status,color_id,size_id,goods_number,depot_id,packet_id,gmt_create,gmt_modify)

None.gifVALUES(SUBSTRING(RAND(),3,8),iv_goods_id,SUBSTRING(RAND(),3,1),SUBSTRING(RAND(),5,1)%2,SUBSTRING(RAND(),3,3),SUBSTRING(RAND(),4,3),SUBSTRING(RAND(),5,2),

None.gif                 iv_depot_id,SUBSTRING(RAND(),4,2)*iv_packet_id,DATE_ADD(NOW(),INTERVAL-SUBSTRING(RAND(),2,3)DAY),DATE_ADD(NOW(),INTERVAL-SUBSTRING(RAND(),3,2)DAY)

None.gif                );

None.gifSETiv_packet_id=iv_packet_id-1;  

None.gifENDWHILE;        

None.gifSETiv_packet_id=20;

None.gifSETiv_depot_id=iv_depot_id-1;  

None.gifENDWHILE; 

None.gif     

None.gifCOMMIT;

None.gifSETiv_depot_id=10;

None.gifSETiv_goods_id=iv_goods_id-1;

None.gifENDWHILE;    

None.gifEND$$

None.gifDELIMITER ;

■ 业务逻辑描述51Testing软件测试网.us*WWv'OY4M)w

● 非注册用户,或网站的注册用户不登陆,都能可选购买物品,生成订单号对应的用户UID为系统默认的;5p9}7z"^"^4N0

● 订单与用户UID关联、描述等信息,存储其它的表中,通过订单号的模式关联;N+j6n|i:n;iMV1Y0

● 用户的订单信息,在未付款之前都可以再修改,付款之后则无法修改;&n(z"SL$J}0

● 已经付费的订单信息,自动发送到物流部门,进行后续工序的操作。处理完毕之后,会更新订单中涉及物品的存储位置信息;$ah$T4KBMtz0

● 定期读取部分数据到数据仓库分析系统,用于统计分析;\0q)c0lJ5qf/i+e;_Y0

● 个人订单查询,前后台都有;QM1L#URO1c&th0p[0

● 购物记录查询显示;Y8{$YX'|^'\"hv0

■ 根据业务规则描述需要使用操纵数据的SQL语句]Ur,N/Qk/kApO:A0P0

None.gif

我来说两句

显示全部

d8a3dac35532145b347031a8fb402eba.gif

4d73fc83cb27b31041650c043e06fdc8.gif

5d06f4dc9b08a7e1fecdedaf9fe87c66.gif

659391f05d11818e0d3bd694a6d99ddc.gif

f27d7d9f67d98cc858fe74ff4d76554e.gif

b0d82b880d66765dd2a1af173b20f406.gif

e87f042c31e114675541bb49e0fbf138.gif

97a372eda248bf63679ecf2d47467589.gif

a14a392968e29ace4cb2ca390d53264e.gif

ff31a40db0d852c3704276b17a1dd158.gif

46298ad80746c3790e9535ce3396efec.gif

ef97f2303f935b723744c0c99db267f8.gif

46add61d58ae5b455d8994b1485357d3.gif

701ffdce43c5ac45c241dba6a7ae431d.gif

4ac0c1a50de5d21a8087006d0295547a.gif

e54bbadbdbb00b0b5cc4182352ca2352.gif

afb655844bdfda4cf47fef6d239f009d.gif

bf5c12b671f1179ba425de53370ebd3d.gif

865ad24093d248b0ec3b85ea66a6aaa7.gif

ab80f8b6419577f8a8ad7bb690794024.gif

内容

昵称

验证

ada834077f6a48ad60a11ec0354fde86.png

提交评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值