首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一个执行计划异常变更的案例 - 外传之直方图

从HISTGRAM列可以看出未有任何直方图统计, ? 根据name=’A’检索,选择了全表扫描的执行计划, ? 根据name=’B’检索,同样选择了全表扫描的执行计划, ?...我们看下如何推导出,以A为例,A对应的十六进制是0x41,将0x41右补至15个字节长度的0,再将其转换为十进制,即3.3750E+35,正如上面对应的第一条记录ENDPOINT VALUE值,...第一条记录的ENDPOINT NUMBER是100000,说明有100000条记录值是A,第二条记录的ENDPOINT NUMBER是100001,说明有(100001-10000=1)条记录值是B。...这种类型的直方图首先会根据列的所有记录按从小到大的顺序排序,用总记录数处于需要使用的Bucket数量,决定每一个Bucket中要存储的记录数,对于相邻Bucket的仅ENDPOINT NUMBER不同,...Bucket的ENDPOINT VALUE是之前存储的最大值100,ENDPOINT NUMBER是1-0=1,因为每一个distinct这只有一条,值为201的记录有700条,一个Bucket不足以存储

69140

数据库相关知识总结

Lower() 将串转换为小写 LTrim() 去掉串左边的空格 Right() 返回串右边的字符 RTrim() 去掉串右边的空格 Soundex() 返回串的SOUNDEX值 SubString()...,它不是一条SELECT语句,而是被该语句检索出来的结果集。...这个过程用前面定义的SELECT语句把数据实际检索出来 对于填有数据的游标,根据需要取出(检索)各行 在结束游标使用时,必须关闭游标 游标用DECLARE语句创建。...数据库备份 使用命令行实用程序mysqldump转储所有数据库内容到某个外部文件。在进行常规备份前这个实用程序应该正常运行,以便能正确地备份转储文件。...可以使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE转储所有数据到某个外部文件。这两条语句都接受将要创建的系统文件名,此系统文件必须不存在,否则会出错。

3.3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    最完整的Explain总结,SQL优化不再困难

    mysql> EXPLAIN SELECT * FROM t1 INNER JOIN t2; 可以看到这个连接查询的执行计划中有两条记录,这两条记录的table列分别是t1和t2,这两条记录用来分别说明对...但是这两条记录对应的id值都是1。... key3 FROM t2 WHERE t1.key1 = 'a1b6cee57a'); 可以看到,虽然我们的查询语句是一个子查询,但是执行计划中t1和t2表对应的记录的id值全部是1,这就表明了查询优化器将子查询转换为了连接查询...然后看执行计划的前两条记录的id值都为1,说明这两条记录对应的表进行连接查询,需要注意的是第二条记录的table列的值是,说明该表其实就是id为2对应的子查询执行之后产生的物化表,...此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的。

    64120

    回龙观大叔狂磕mysql(第二回)

    也就是上一回合提到的每个 page页 最少两条记录的原因 4.record_type 当前行记录类型 类型值 含义 0 普通记录(通常我们插入的数据记录) 1 B+树非叶节点记录(索引数据) 2 页最小记录...比方说第一条记录的 next_record 值为64,意味着从第一条记录的真实数据的地址处向后找64个字节便是下一条记录的真实数据, 如果 next_record 为0, 则表示没有下一条记录了, 这个对于我们数据检索来说是非常重要的...没错, 我们看看 mysql 是怎么实现页 ”页级别目录“ 的 (此图为回龙观大叔所盗《mysql是怎样运行的》, 与本文作者无关) 简单来说, 就是一个 page 页中最大8条记录分组, 将每组最小最大的值偏移量记录到...(此图为回龙观大叔所盗, 与本文作者无关) 联合索引 页面和记录先按照联合索引前边的列排序,如果该列值相同,再按照联合索引后边的列排序....索引列的类型小, 对于大类型列占据更多的存储空间, 检索效果不好, 可以选定索引字符串值的前缀.

    55740

    一个执行计划异常变更的案例 - 外传之绑定变量窥探

    一条SQL语句在解析阶段,会根据SQL文本对应的哈希值在库缓存中查找是否有匹配的Parent Cursor,进而找出是否有可重用的解析树和执行计划,若没有则要重新生成一遍,OLTP系统中,高并发的SQL...两条记录,说明Oracle认为这两条SQL是不同。...其中name列是非唯一索引,NAME是A的有100000条记录,NAME是B的有1条记录,值分布是不均匀的,上一篇文章中我们使用如下两条SQL做实验, select * from t1 where name...发现仍旧是全表扫描,我们之前知道B值记录只有一条,应该使用索引范围扫描,而且这两个SQL执行计划中Rows、Bytes和Cost值完全一致。...简而言之,数据分布不均匀的列使用绑定变量,尤其在11g之前,受绑定变量窥探的影响,可能会造成一些特殊值作为检索条件选择错误的执行计划。

    66330

    【性能优化】一个执行计划异常变更的案例(上)

    取值为B的记录占据了1/10001很小的比重,因此使用索引扫描,直接访问B*Tree二叉树,定位到这一条数据的rowid再回表查询所有select字段的成本要远小于扫描整张表数据的成本。...一条SQL语句在解析阶段,会根据SQL文本对应的哈希值在库缓存中查找是否有匹配的Parent Cursor,进而找出是否有可重用的解析树和执行计划,若没有则要重新生成一遍,OLTP系统中,高并发的SQL...两条记录,说明Oracle认为这两条SQL是不同。...如下是测试表: 其中name列是非唯一索引,NAME是A的有100000条记录,NAME是B的有1条记录,值分布是不均匀的,上一篇文章中我们使用如下两条SQL做实验, select* from t1...简而言之,数据分布不均匀的列使用绑定变量,尤其在11g之前,受绑定变量窥探的影响,可能会造成一些特殊值作为检索条件选择错误的执行计划。11g的时候则推出了ACS(自适应游标),缓解了这个问题。

    1.2K100

    2022最新MySQL面试题-有详细完整的答案解析

    使用BLOB和TEXT则要慎重,一般把 BLOB或TEXT 列分离到单独的表中,还可以对BLOB或TEXT 列使用合成的(Synthetic)索引,就是根据大文本字段的内容建立一个散列值并单独存储在数据列中...,可以通过检索散列值找到数据行。...,二者含义如下: 1、Virtual Generated Column(虚拟生成的列):不存储该列值,即MySQL只是将这一列的元信息保存在数据字典中,并不会将这一列数据持久化到磁盘上,而是当读取该行时...事务2中是删除了符合的记录而不是插入新记录,那事务1中之后再根据条件读取的记录变少了,在MySQL中这种现象不属于幻读,相当于对每一条记录都发生了不可重复读的现象。...;对IN子查询会进行物化、物化表转连接查询、转换为半连接等方式进行。

    1K10

    Oracle学习笔记整理手册

    synonyms (6)oracle内外连接 Oracle左右连接可以使用(+),+号在左表示右外连接,在右表示左外连接 (7)oracle去重关键字 Oracle关键字: distinct:过滤掉多余的重复记录只保留一条...in可以有多条记录,=只有一条记录 =性能更好,因为使用=符合能更好地使用索引 (12)NVL函数和NVL2函数 NVL函数的格式如下:NVL(expr1,expr2) 含义是:如果oracle...所有表达式必须是相同类型,或者可以隐性转换为相同的类型。...start with后可以加一些开始条件,没有就写1=1或者不写也可以的。id和parent_id根据业务需要替换。...string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。

    1K10

    【MySQL】索引啊 d=====( ̄▽ ̄*)b

    为什么是 B+ 树 要实现上面的功能,首先可以采用 Hash Table 的方式,将索引键 Hash 之后存储哈希值和键对应的行指针,这样一来,在使用哈希索引查询的时候就可以直接计算出要查询记录的哈希值...无法根据索引进行有效排序,哈希之后的的值已经丢失了原来的索引键的大小信息,所以无法根据索引进行高效排序 除了使用 Hash Table, 另一个思路是使用排序树,以排序树的结构组织页后,可以将原来查询...: 在进行等值查询如= 或 IN 时, 可以不考虑顺序,SQL 查询优化器会自动调整语句顺序,如执行下面两条语句的效果是一样的(根据索引长度我们可以推断出对哪几个列使用了索引): 可以查询建立了聚合索引的某几列...a = "1" AND b = "2" AND c = "4" 时,数据库会根据第一个关键字 a 的值 1 定位到某个叶子(图中左边的叶子节点),然后从所有叶子节点的数据里检索出符合第一条规则a =...`left` WHERE a = "1" AND b LIKE "2%" 虽然 b 的检索不是等值检索,但我们任然可以根据 like 子句开头的 “2” 快速定位到 2 ~ 4 行,但如果以通配符开头,

    1K30

    面试题87:UPDATE操作对应的undo日志

    ---- 【不更新主键】 就地更新 在更新记录时,对于被更新的每个列来说,如果更新后的列与更新前的列占用的存储空间一样大,那么可以进行就地更新,也就是直接在原记录的基础上修改对应列的值。...先删除旧记录,再插入新记录 如果有任何一个被更新的列在更新前后占用的存储空间大小不一致,那么就需要先把这条旧记录从聚簇索引页面中删除,然后在根据更新后列的值创建一条新的记录并插入到页面中。...、更新前该列的真实值。...---- 【更新主键】 步骤一:将旧记录进行delete mark操作 此时仅执行delete mark操作。而在事务提交后,才由专门的线程执行purge操作,从而把它加入到垃圾链表中。...步骤二:根据更新后各列的值创建一条新记录,并将其插入到聚簇索引中 针对UPDATE语句更新记录主键值的这种情况,在对该记录进行delete mark操作时,会记录一条类型为TRX_UNDO_DEL_MARK_REC

    27440

    《SQL必知必会》万字浓缩精华

    如果将值和字符串类型的比较,需要使用限定符号 3、用来与数值列进行比较的值,则不用括号。...文本处理函数 函数 说明 LEFT() 返回字符串左边的字符 LENGTH() 返回字符串的长度 LOWER() 将字符串转换为小写 LTRIM() 去掉值左边的所有空格 RIGHT() 返回字符串右边的字符...RTRIM() 去掉值右边的所有空格 SOUNDEX() 返回字符串的SOUNDEX值 UPPER() 将字符串转换为大写 SOUNDEX是一个将任何文本串转成描述其语音表示的字母数字模式的算法。...INSERT的另一种使用是将SELECT检索出来的结果插入到表中,使用INSERT SELECT语句 INSERT INTO Customers(cust_id, -- 2、将SELECT检索的结果插进来...如果没有发生错误,整个语句提交到数据库表中;如果发生错误,则进行回退(撤销),将数据库恢复到某个已知且安全的状态 栗子:银行转账业务 比如在两个表中,A(原有400)给B(原有200)转200块钱,包含两个过程

    7.5K31

    MySQL中InnoDB引擎的辅助索引扩展

    所以当我们需要根据辅助索引查找行记录时,需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。...那我们考虑这样一个场景:当我们连续地插入两条辅助索引值相同,但主键值不同的两条数据记录时,辅助索引会怎么排列这两条记录的顺序呢?...比如我再插入一条记录(17,"Alice", 30),那在辅助索引这幅图中,(Alice,17)这个节点最终是会在(Alice,18)这个节点的左边还是右边呢?...但当我们按照辅助索引查询时,查询的结果是先按按辅助索引从小到大排序,辅助索引值相同时则是按主键索引从小到大排序。那InnoDB是如何做到这一点的呢?这就涉及到本文要讲的辅助索引的索引扩展特性。..._51CTO博客_了解MySQL InnoDB表的二级索引是否加入主键列 关于MySQL InnoDB表的二级索引是否加入主键列的问题解释 关于MySQL InnoDB表的二级索引是否加入主键列的问题解释

    1.1K20

    SQL必知必会总结

    如果将值和字符串类型的比较,需要使用限定符号 3、用来与数值列进行比较的值,则不用括号。...文本处理函数 函数 说明 LEFT() 返回字符串左边的字符 LENGTH() 返回字符串的长度 LOWER() 将字符串转换为小写 LTRIM() 去掉值左边的所有空格 RIGHT() 返回字符串右边的字符...RTRIM() 去掉值右边的所有空格 SOUNDEX() 返回字符串的SOUNDEX值 UPPER() 将字符串转换为大写 SOUNDE(X)是一个将任何文本串转成描述其语音表示的字母数字模式的算法...INSERT的另一种使用是将SELECT检索出来的结果插入到表中,使用INSERT SELECT语句 INSERT INTO Customers(cust_id, -- 2、将SELECT检索的结果插进来...如果没有发生错误,整个语句提交到数据库表中;如果发生错误,则进行回退(撤销),将数据库恢复到某个已知且安全的状态 栗子:银行转账业务 比如在两个表中,A(原有400)给B(原有200)转200块钱,包含两个过程

    9.2K30

    pandas时间序列常用方法简介

    举例如下: 1.首先创建数据结构如下,其中初始dataframe索引是时间序列,两列数据分别为数值型和字符串型 ? 2.运用to_datetime将B列字符串格式转换为时间序列 ?...仍然以前述的时间索引记录为例,首先将其按4小时为周期进行采样,此时在每个4小时周期内的所有记录汇聚为一条结果,所以自然涉及到聚合函数的问题,包括计数、求均值、累和等等。 ?...直观来看,由于此时是将6条记录结果上升为12条记录结果,而这些数据不会凭空出现,所以如果说下采样需要聚合、上采样则需要空值填充,常用方法包括前向填充、后向填充等。...进一步的,当freq参数为None时,则仅仅是滑动指定数目的记录,而不管索引实际取值;而当freq设置有效参数时,此时要求索引列必须为时间序列,并根据时间序列滑动到指定周期处,并从此处开始取值(在上图中...例如,求解连续3条记录的均值,则可简单实现如下: ? 注意到由于窗口长度设置为3,前两条记录因为"向前凑不齐"3条,所以结果为空值。当然,就这一特定需求而言,也可由shift函数实现: ?

    5.8K10

    SQL必知必会总结4-第18到22章

    如果没有发生错误,整个语句提交到数据库表中;如果发生错误,则进行回退(撤销),将数据库恢复到某个已知且安全的状态 栗子:银行转账业务 比如在两个表中,A(原有400)给B(原有200)转200块钱,包含两个过程...1、主键 主键是一种特殊的约束,用来保证一列(或者一组列)中的值是唯一的。...,其值必须列在另一表的主键中。...检查约束用来保证一列(或者一组列)中的数据满足一组指定的条件,常见的用途有: 检查最大值或者最小值 指定数据的范围 只允许特定的值,例如性别字段中只允许M或者F CREATE TABLE OrderItems...触发器的常见用途: 保证数据一致 基于某个表的变动在其他表上执行活动 进行额外的验证并根据需要回退数据 计算计算列的值或者更新时间戳 触发器创建语法四要素: 监视地点(table) 监视事件(insert

    1.3K30

    MySQL Explain详解

    index: Full Index Scan,index与ALL区别为index类型只遍历索引树 range:只检索给定范围的行,使用一个索引来选择行 ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值...如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引...五、possible_keys 指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用 该列完全独立于EXPLAIN输出所示的表的次序。...七、key_len *表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的...)* 不损失精确性的情况下,长度越短越好 八、ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 九、rows 表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

    1.1K10

    保护用户PII数据的8项数据匿名化技术

    数据置换(Data Swapping) 这种技术指的是在数据集中重新排列或置换两个或多个敏感数据记录。匿名化是通过将一条记录中的值与另一条记录的相应值置换或交换来完成的,即置换数据集中两条记录的位置。...但是,可能仍然需要某些形式的病人身份证明,以便将不同来源的医疗记录联系起来。 它可以与散列、加密或令牌化等方法结合使用。...例如,将姓名或身份证号等数据转换为固定长度的字符串,称为散列或随机生成的令牌(随机字母数字代码)。它是原始数据的唯一表示,但不能反向识别或显示原始数据。然后,该散列可以用作原始PII的假名。 6....针对这项技术的推荐工具是K2View,它通过其获得专利的微数据库技术,提供K-匿名技术作为其数据匿名化功能的一部分。这涉及到将具有类似准标识符(如年龄范围或职位)的记录分组到一个集群中。...每个集群中的记录共享准标识符的相同属性,使得基于这些属性识别个体变得困难。接下来,将唯一标识符或值分配给集群,以取代原始的准标识符。

    86920

    MySQL索引最左匹配原则及优化原理

    使用覆盖索引在索引k上其实读了三个记录,R3~R5(对应的索引k上的记录项) 但对于Server层,就是找引擎拿到两条记录,因此MySQL认为扫描行数是2。...,将索引建立在where子句的集合过程中,对于需要加速或频繁检索的数据列,可以让这些经常参与查询的数据列按照索引的排序进行查询,加快查询的时间 如果为每一种查询都设计个索引,索引是不是太多?...MySQL5.6前,只能从ID3开始个个回表,到主键索引上找数据行,再对比字段值。...无索引下推执行流程,在(name,age)索引里特意去掉age的值,这过程InnoDB并不看age的值,只按顺序把“name第一个字是’张’”的记录一条条取出来回表,回表4次。...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15

    2.9K10

    MySQL索引

    6.尽量使用前缀来索引   如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索   会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。...记住一定是用到primary key 或者unique,并且只检索出两条数据的 情况下才会是const,可以理解为const是最优化的 a....d. ref:使用非唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值的记录行 e. eq_ref:类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用...如将主键置于where列表中,MySQL就能将该查询转换为一个常量 g....,不是通过表内检索出的) 8、ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 9、rows 表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数 10

    3.9K50
    领券