mysql中如何在存储过中立创建临时表

mysql中如何在存储过中立创建临时表,第1张

MySQL 需要创建隐式临时表来解决某些类型的查询。往往查询的排序阶段需要依赖临时表。例如,当您使用 GROUP BY,ORDER BY 或DISTINCT 时。这样的查询分两个阶段执行:首先是收集数据并将它们放入临时表中,然后是在临时表上执行排序。

对于某些 UNION 语句,不能合并的 VIEW,子查询时用到派生表,多表 UPDATE 以及其他一些情况,还需要使用临时表。如果临时表很小,可以到内存中创建,否则它将在磁盘上创建。MySQL 在内存中创建了一个表,如果它变得太大,就会被转换为磁盘上存储。内存临时表的最大值由 tmp_table_size 或 max_heap_table_size 值定义,以较小者为准。MySQL 5.7 中的默认大小为 16MB。如果运行查询的数据量较大,或者尚未查询优化,则可以增加该值。设置阈值时,请考虑可用的 RAM 大小以及峰值期间的并发连接数。你无法无限期地增加变量,因为在某些时候你需要让 MySQL 使用磁盘上的临时表。

注意:如果涉及的表具有 TEXT 或 BLOB 列,则即使大小小于配置的阈值,也会在磁盘上创建临时表。

显式内连接就是使用inner join的办法,写起来复杂些以windows版本mysql里自带的sakila数据库为例显式内连接语法 select 字段名 from 表1 join 表2 on 连接条件 [ join 表3 on 连接条件 ... ] [ where 查询条件 ... ]SELECT store.address_id,first_name,last_name FROM store INNER JOIN staff ON store.manager_staff_id=staff.staff_id结果:address_id first_name last_name1 Mike Hillyer2 Jon Stephens隐式内连接语法 select 字段名 from 表1,表2 [ ,表3... ] where 连接条件 [ and 查询/连接条件 ... ]SELECT store.address_id,first_name,last_name FROM store,staff WHERE store.manager_staff_id=staff.staff_id结果:address_id first_name last_name1 Mike Hillyer2 Jon Stephens相对而言,隐式连接好理解好书写,语法简单,担心的点较少。但是显式连接可以减少字段的扫描,有更快的执行速度。这种速度优势在3张或更多表连接时比较明显

原来只知道, MySQL类型隐式替换会影响优化器对索引的选择, 由于遇到了一个隐式替换导致的精度丢失的 Bug ,引起了我对隐式替换的实现逻辑的好奇心.

为什么隐式替换会影响精度吗? 不是类似 String.valueOf() 处理吗?

执行SQL 1 :

查询结果 1 :

执行SQL 2 :

查询结果 2 :

由上面的两个SQL看到, 由于where条件的业务订单id筛选项没有添加引号, 导致了精度丢失问题. 210517130303013756 在表中是唯一的, 但是查出来多条数据.

如需构建演示环境请执行如下SQL

这里贴出了数字类型相关的替换规则, 想了解更多请查阅官方文档

有关隐式数字到字符串转换的字符集以及适用于 CREATE TABLE ... SELECT 语句的修改规则,请参阅本节后面的信息。

以下规则描述了比较 *** 作如何发生转换:

有关将值从一种时间类型转换为另一种时间类型的信息,请参见 第11.2.8节“日期和时间类型之间的转换” 。

由于 210517130303013756 没有加引号, 默认将其作为浮点数处理, 所以在 210517130303013756 转浮点数的时候, 导致了精度丢失问题.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5907105.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-07
下一篇 2023-03-07

发表评论

登录后才能评论

评论列表(0条)

保存