(中国软件网讯)首先让我们了解一下测试用例,测试用例为B2C领域,一张用于存储用户选购物品而生成的产品订单信息表,不过去掉一些其他字段,以便用于测试。

其中,主键信息: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`为联合主键索引的尾部。

数据存储表设计的小结:

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

首先,确定哪些数据项或组合,可以作为记录的唯一性标志;

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

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

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

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

用于生成测试数据的存储过程代码

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

存储过程代码:

业务逻辑描述

非注册用户,或网站的注册用户不登陆,都能可选购买物品,生成订单号对应的用户UID为系统默认的;

订单与用户UID关联、描述等信息,存储其它的表中,通过订单号的模式关联;

用户的订单信息,在未付款之前都可以再修改,付款之后则无法修改;

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

定期读取部分数据到数据仓库分析系统,用于统计分析;

个人订单查询,前后台都有;

购物记录查询显示;

根据业务规则描述需要使用操纵数据的SQL 语句

前台用户点击触发的操作而会执行的SQL 语句为:01、02、03;

后台内部用户点击触发的操作而会执行的SQL 语句为:01、02、03、04、05、06、07;

后台系统自动定期执行:04、05、06、07,工作时间正常情况每隔15分钟执行一次,以检查是否有已付款而没有准备货物的订单、是否有收款而未发货的订单等;

统计分析系统定期导出数据而执行的SQL 语句为:08,频率为每24小时一次;

我们再分析上述列出来的SQL ,分为2类,一类是读操作的SQL (备注:SELECT操作),另外一类为修改性操作(备注:UPDATE、DELETE操作),分别如下:

SELECT 的WHERE子句、GROUP BY子、ORDER BY 子句和HAVING 子句中,出现的字段:

(1). order_id

(2). order_id+gmt_modify

(3). depot_id+gmt_modify

(4). depot_id+packet_id+gmt_modify

(5). goods_id+order_status+order_type

(6). goods_id+order_status+order_type+gmt_modify

(7). gmt_modify

修改性操作的WHERE子句中出现的条件字段:

(8). order_id+ goods_id

我们已经存在主键索引:PRIMARY KEY(order_id,`goods_id`),另外考虑到此表数据的操作以SELECT和INSERT为主,UPDATE的SQL 量其次,再根据上述SQL 语句,为此我们可以初步确定需要创建的索引:

总结:

文章中也分析了为何联合主键索引的顺序为:order_id,`goods_id`,再补充下作为主键的联合索引的字段属性的其他特性:字段值写入之后不变化、字段值长度短且最好为数值类型;

对于编号SQL :(8),每天按更新日期读取一次数据的操作,以采用全表扫描的方式实现,牺牲其数据读取的性能,以减少更新字段修改日期的值而带来的索引维护开销;

对于编号SQL :(4)、(5),考虑到每次都是读取最新的50条记录,以及读取的数据基本上可肯定为热数据,为此不得不牺牲其中一条SQL 的数据读取性能,而少创建一个联合索引,从而减少维护索引字段的IO量;

对于编号SQL :(6)、(7),创建的联合索引,需要特别注意联合索引:idx_goodsID_orderType_orderStatus_gmtmodify(goods_id,order_type,order_status,gmt_modify)中的字段顺序,其中:

goods_id字段的筛选率高于order_type,order_status,另外gmt_modify字段只出现在ORDER BY子句中,为此只有让goods_id字段作为联合索引的头部,以提高索引的筛选率,从而提高索引的效率,减少逻辑或物理的读。

order_status字段只有0或1两种值,而order_type有多种,以及根据SQL 语句,必须order_type出现在联合中的位置要比order_status靠近头部;

gmt_modify字段出现在ORDER BY子句中,为此必须放到联合索引字段的最后;

最后,再梳理一下从需求到设计存储结构,再到编写SQL 和创建索引结构,我们应该做的步骤:

整理业务产生的数据流,读取数据的方式;

整理清楚数据流中的每个数据项属性信息;

分析业务指标,推测需要存储数据的规模(备注:一定要以多少GB 作为容量单位);

选择可能用于支持业务的硬件设备和数据库架构;

把所有可能操纵数据的条件和操作类型,都整理清楚;

分析操纵数据条件字段各自的数据筛选率;

权衡各个SQL 的性能和IO量,也即类似于哪个操作权重高一些,那些操作权重适当低一些;

创建索引组织结构;

收集测试和生产环境的反馈信息,优化索引组织结构;

备注:

本想再用测试环境结合业务的方式,跑一套模拟测试脚本程序,让大家更加直观地看到不同索引组织情况下,相同的SQL 操作及频率,数据库服务器的处理能力和负载变化及对比信息,可惜唯一的服务器无法使用了,只好放弃。对于分析相同的SQL ,走不通索引,其需要的逻辑IO和物理IO量也是一个办法,此次就不分析了,有需要的朋友可以去玩玩,另外建议初学者一定要好好阅读下mysql 手册上的相关章节内容:7.2.6. Index Merge Optimization。

免责声明:

本站系本网编辑转载,会尽可能注明出处,但不排除无法注明来源的情况,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本网联系, 来信: liujun@soft6.com 我们将在收到邮件后第一时间删除内容!

[声明]本站文章版权归原作者所有,内容为作者个人观点,不代表本网站的观点和对其真实性负责,本站拥有对此声明的最终解释权。

mysql 组织结构 支持_如何优化MySQL索引组织结构相关推荐

  1. Mysql 索引优化分析_如何优化MySQL的性能?从索引方面优化案例分析

    今天我们来讲讲如何优化MySQL的性能,主要从索引方面优化. 建表 //建表 CREATETABLEIFNOTEXISTSstaffs( idINTPRIMARYKEYAUTO_INCREMENT, ...

  2. mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】

    原文:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

  3. mysql 树形结构_再读MySQL索引-《高性能MySQL》索引手记

    最近工作中经常和MySQL打交道,当数据量小的时候,不同查询方式以及是否使用索引并无大碍,当数据量随着业务的成长急剧加速时,索引的重要性不言而喻. 本篇文章以<高性能MySQL>中的索引章 ...

  4. mysql fnv算法_《高性能MySQL》读书笔记之创建高性能的索引

    索引是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化的最有效手段.索引能够轻易将查询性能提高几个数量级.创建一个最优的索引经常需要重写查询. 5.1索引基础 在MySQL中,存储引擎 ...

  5. mysql客户端工具_性能优化-理解 MySQL 体系结构(MySQL分库分表)

    实例和数据库 我们通常所说的 MySQL 数据库服务器由一个实例(instance)以及一个数据库(database)组成.实例包括一组后台进程/线程和许多内存结构,用于管理数据库:数据库由一组磁盘文 ...

  6. mysql 怎么查询慢sql语句_如何优化MySQL中查询慢的SQL语句啊?

    追问 恩恩我对sql稍微了解点 不知道怎么优化慢sql 可以指导一下嘛 谢谢啦 可以加下我qq吗 1501630150来自:求助得到的回答 mysql数据库有100万+数据,查询起来很慢了,如何优化 ...

  7. mysql 什么树_搞懂MySQL InnoDB B+树索引

    一.InnoDB索引 InnoDB支持以下几种索引: B+树索引 全文索引 哈希索引 本文将着重介绍B+树索引.其他两个全文索引和哈希索引只是做简单介绍一笔带过. 哈希索引是自适应的,也就是说这个不能 ...

  8. MySQL高级篇(SQL优化、索引优化、锁机制、主从复制)

    目录 0 存储引擎介绍 1 SQL性能分析 2 常见通用的JOIN查询 SQL执行加载顺序 七种JOIN写法 3 索引介绍 3.1 索引是什么 3.2 索引优劣势 3.3 索引分类和建索引命令语句 3 ...

  9. 如何监控和优化mysql查询性能_如何监视MySQL的性能

    这里列出了一些如何监视你安装的mysql性能的一些ideas.监视总是一个持续的过程.你需要知道哪种模式对你的数据库是好的,什么是问题的表象,甚至是危险的情况. 一下列出了用来去监视你的系统的主要参数 ...

最新文章

  1. Python sort
  2. 在Intellij上面导入项目 AOP示例项目 AspectJ学习 Spring AoP学习
  3. 什么是CommonJS?
  4. 未来CRM的趋势和预测
  5. js排序的时间复杂度_JavaScript插入排序算法通俗说明
  6. ERP的昨天、今天和明天
  7. 跨境商品的进口税额显示
  8. ASP.NET 5 Beta7发布
  9. akshare双均线backtrader
  10. STM32F103C8T6用官方bootloader实现IAP升级操作方法
  11. SQL 递归树 子父节点相互查询
  12. NetApp F3020 盘柜报警升级修复全过程
  13. 开源分词系统pkuseg学习
  14. Android实现百度地图定位服务
  15. 基于springboot+mysql的房地产中介管理系统
  16. Loadrunner:管理员权限启动报错“win10为了对电脑进行保护,已经阻止此应用”
  17. CSDN 博客更换皮肤
  18. 关闭455端口相关服务
  19. 天下难事始于易,天下大事始于细。
  20. 找工作需要有工作经验,而没工作就没工作经验。如何理解这种死循环?

热门文章

  1. marvin java_使用Java中的Marvin框架去除轮廓
  2. Win10系统将“用户”文件夹下用户名文件夹修改自定义名称
  3. c语言 游程编码,简单的行程编码-C语言实现
  4. python实现游程编码(leetcode)
  5. Sprite Renderer
  6. 自动化测试处理textarea文本框
  7. 软件测试-进阶篇:设计测试用例-文本框
  8. 使用Mysql函数生成指定的自增序列号
  9. ChatGPT初体验——开发好帮手
  10. 农历2017年8月初4_2017年8月25日