【IT168 技术】数字辅助表是一个只包含从1到N的N个整数的简单表,N通常很大。因为数字辅助表是一个非常强大的工具,可能经常需要在解决方案中用到它,笔者建议创建一个持久的数字辅助表,并根据需要填充一定数据量的值。

实际上如何填充数字辅助表无关紧要,因为只需要运行这个过程一次。不过还可以对填充语句进行优化。一般的SQL编程人员会想到用如下方法来生成1~N的数。

CREATE TABLE Nums(

aINTUNSIGNEDNOTNULLPRIMARY KEY

)ENGINE=InnoDB;

CREATE PROCEDURE pCreateNums (cntINTUNSIGNED)

BEGIN

DECLARE sINTUNSIGNED DEFAULT1;

TRUNCATE TABLE Nums;WHILEs<=cntDOBEGIN

INSERT INTO NumsSELECTs;SETs=s+1;END;ENDWHILE;END;

这个方法没有任何的问题,只是效率不高。例如要插入100 000行的数据,在笔者的四核苹果电脑上至少需要1分钟。

mysql>CALLpCreateNums (100000);

Query OK,1row affected (1min11.56sec)

这个方法的开销主要在于INSERT语句被执行了100 000次。我们可以通过下面这个方法来创建数字辅助表。

CREATE PROCEDURE pFastCreateNums (cntINTUNSIGNED)

BEGIN

DECLARE sINTUNSIGNED DEFAULT1;

TRUNCATE TABLE Nums;

INSERT INTO NumsSELECTs;WHILEs*2<=cntDOBEGIN

INSERT INTO NumsSELECTa+s FROM Nums;SETs=s*2;END;ENDWHILE;END;

在这个存储过程中,变量s保存插入该表的行数。该过程先把1插入数字辅助表,然后当s*2<=cnt成立时执行循环。在每次迭代中,该过程把数字辅助表当前所有行的值加上s后再插入数字辅助表中,即先插入{1},然后是{2},{3,4},{5,6,7,8},{9,10,11,12,13,14,15,16},以此类推。因此这个存储过程的执行时间非常之快。要插入200 000行数据,情况如下:

mysql>CALLpFastCreateNums (200000);

Query OK,65536rows affected (1.00sec)

可以看到执行时间缩短到了1秒钟,性能提高了70多倍。究其原因,是因为实际执行INSERT的次数少了。这里我们是按照2的指数次进行插入的,实际只执行了17次插入操作。这个解决方案的唯一缺点是,数字辅助表是按照2的指数次进行插入的,因此上述实际的插入行数是131 072,而不是200 000行。查询一下刚才插入的数据,结果如下:

mysql>SELECTCOUNT(1) FROM Nums;+----------+| count(1) |+----------+|131072|+----------+1row inset(0.03sec)

不过这不是一个很大的问题,因为我们可以在取出数据时使用<=来截取指定的行数,如:

SELECT*FROM Nums WHERE a<=100000

有了这张辅助表,用户可以通过它来辅助很多其他应用。例如,在数据仓库中,通常需要生成某个时间范围内的时间维度表,这时使用数字辅助表会非常简单和快捷,示例如下:

CREATE PROCEDURE pCreateDimTime(startDATE,endDATE)

BEGINSELECTDATE_ADD(start,INTERVAL a-1DAY)

FROM Nums WHERE a<=DATEDIFF(end,start)+1;END;

作者简介

姜承尧(DavidJiang),《MySQL技术内幕:SQL编程》、《MySQL技术内幕:InnoDB存储引擎》作者,资深MySQL数据库专家,MySQL开源分支版本InnoSQL的创始人,独立数据库咨询顾问。不仅擅长于数据库的管理和维护,还擅长于数据库的开发,同时一直致力于MySQL数据库底层实现原理的研究和探索,对高性能数据库和数据仓库也有深刻而独到的理解。目前就职于网易研究院,担任后台技术中心技术经理一职,从事MySQL数据库底层以及云的相关的开发工作。

mysql数字辅助表_关于数字的经典SQL编程问题:数字辅助表相关推荐

  1. java 数字 下划线_为什么要在Java SE 7的数字中使用下划线-在数字文字中使用下划线...

    java 数字 下划线 JDK 1.7发行版引入了几个有用的功能,尽管其中大多数都是语法糖,但使用该功能可以大大提高可读性和代码质量. 这样的功能之一是在数字文字中引入下划线 . 从Java 7开始, ...

  2. mysql函数 动态语句_自定义函数动态执行SQL语句

    Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者. DDL 和 DML Sql代码 收藏代码 /*** DDL ***/ begin EX ...

  3. java导出数据透视表_使用数据库中的Java流制作数据透视表

    java导出数据透视表 来自数据库行和表的原始数据不能为人类读者提供太多了解. 相反,如果我们对数据执行某种聚合,则人类更有可能看到数据模式 在向我们展示之前. 数据透视表是聚合的一种特定形式,我们可 ...

  4. MySQL性能管理及架构设计(三):SQL查询优化、分库分表 - 完结篇

    上一篇:MySQL性能管理及架构设计(二):数据库结构优化.高可用架构设计.数据库索引优化 一.SQL查询优化(重要) 1.1 获取有性能问题SQL的三种方式 通过用户反馈获取存在性能问题的SQL: ...

  5. mysql分库分表优化性能,MySQL性能管理及架构设计(三):SQL查询优化、分库分表 - 完结篇...

    一.SQL查询优化(重要) 1.1 获取有性能问题SQL的三种方式 通过用户反馈获取存在性能问题的SQL: 通过慢查日志获取存在性能问题的SQL: 实时获取存在性能问题的SQL: 1.1.2 慢查日志 ...

  6. hive 自定义元数据表_[一起学Hive]之十四-Hive的元数据表结构详解

    关键字:Hive元数据.Hive元数据表结构 之前在 "[一起学Hive]之一–Hive概述,Hive是什么"中介绍过,Hive自己维护了一套元数据,用户通过HQL查询时候,Hiv ...

  7. 删除 多个表_合并汇总多个工作簿多个工作表,删除修改新增更新内容只需刷新...

    要求:1.把多个工作簿的多个工作表内容合并汇总 2.后续在任一工作表内删除修改新增内容,无需再重新做表 3.后续在任一工作簿中新增一个或多个工作表,无需再重新做表 4.后续在文件夹中添加一个或多个Ex ...

  8. c语言乘法口诀表的流程图_例18:C语言编程实现九九乘法表

    例18:C语言编程实现九九乘法表,样式要求长方形.右三角形.左三角形. 解题思路:这个问题的算法很简单,就是两个for循环的嵌套,三角形的样式就是多了一些空格. 长方形源代码演示: #include& ...

  9. sqlserver根据字段查表_查找sqlserver数据库中,查询某值所表名和字段名

    有时候我们想通过一个值知道这个值来自数据库的哪个表以及哪个字段,通过一个存储过程实现的.只需要传入一个想要查找的值,即可查询出这个值所在的表和字段名. 前提是要将这个存储过程放在所查询的数据库. CR ...

最新文章

  1. CC1100E被不同频段的频率干扰问题
  2. UITextField与UITextView的区别
  3. 封装,抽象,继承,多态
  4. 25个创意的交互式图表设计欣赏
  5. 【读书笔记】基础博弈知识小结
  6. 【虚拟化实战】Cluster设计之一资源池
  7. android usb弹窗权限r,Android USB权限对话框永远不会出现
  8. JavaSE进阶学习笔记-目录汇总(待完成)
  9. 给公司部门设计的SOA架构
  10. Grep与web漏洞挖掘转
  11. android手机界面分区,Android手机fastboot 刷机命令(示例代码)
  12. Android CameraX 仿一甜相机(录像、拍照、可调节尺寸、聚焦、照明、网格线),最全的CameraX教程
  13. 康托尔集合论-罗素悖论-公理化集合论-不完全性定理
  14. 来了!5G和AI的未来 这10位行业领袖这么说
  15. auto.js实现支付宝蚂蚁森林自动收能量、自动偷能量教程,最简单的收能量脚本,MIUI 10亲测可用
  16. 黑白棋的设计说明(一)
  17. SRS部署集群服务 Edge 模式[SRS V4.0]
  18. Redis-NoSql结构化数据库
  19. 青春期玩游戏不想上学怎么办?
  20. 测试计划和测试用例的方法

热门文章

  1. oracle registers,【案例】Oracle RAC强制删除node节点过程的详细笔记
  2. 超键、候选键、主键、外键区别?
  3. fiddler命令cls/select
  4. MockServer 服务框架设计
  5. 接口测试-接口定义功能-前端-实现动态增删表单
  6. 过来人的亲身经验告诉你,如何从菜鸟晋升月薪过万的测试工程师
  7. 自学软件测试!自学到什么程度可以出去找工作...拿到阿里offer才知道这就够用了...
  8. 六年级下册百分数计算题_六年级数学上册期末试卷(附答案)
  9. 华为3500光端机基本介绍_华为OSN3500光端机License授权管理介绍
  10. loop one image for 10 secs