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

记录一次实际过程中的MySql数据库SQL优化

公司目前的项目数据达到了百万级别了,让我优化一下慢 SQL,之前是懂一些 SQL 优化和索引相关的理论知识,没有实际操作过,特此记录优化的过程和思路,事实证明,理论和实操还是有不少区别的。...SQL语句执行顺序 实际过程 理论是基础,在实际的过程当中需要灵活的运用。特此记录自己在进行优化时的一些操作和心得。 查看执行语句选择的索引,一次查询只会选择一个索引,是mysql自动进行的选择。...但是mysql并不会总是选择我们希望的索引。所以要结合索引的相关知识让mysql选择到我们希望的索引。...在1的基础上,需要注意,当我们新建一条索引之后,可能会导致之前某些SQL在索引的选择上发生变化。...---- 标题:记录一次实际过程中的MySql数据库SQL优化 作者:海加尔金鹰 地址:https://www.hjljy.cn/articles/2020/01/09/1578549162667

87920

三种批量删除PLSQL写法效率的比对

这个存储过程接受一个参数,表示删除几天前的数据,删除DELETE语句按照一个时间字段和这个参数比较得出符合条件的记录集,同时使用rownum限制每次执行DELETE-COMMIT事务的条数,循环执行,直至出现...这个存储过程最优的地方,是使用了批量提交,不是执行一次DELETE删除所有记录COMMIT,如果这么执行,可能会占用大量的UNDO回滚段,进而可能出现回滚段空间不足的报错,也可能出现ORA-1555的错误...毕竟UNDO中记录的是SQL语句的逆向,对于DELETE语句,逆向就是INSERT,即会存储删除的整条记录。...39.80 clear_fetch用时00:22.24 clear_fetch胜出,但一次性删除5万条记录,TABLE ACCESS FULL下的SQL语句由于执行次数减小为原来的5倍,效率上有提升...从实验中可以得出的结论, (1) SQL使用TABLE ACCESS FULL的执行计划,若SQL执行次数较多时,则BULK+forall的方式,效率较高;若SQL执行次数较少时,很可能使用TABLE

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

    又见程序媛 | 从索引的创建角度分析热门“面试题”

    Oracle默认认为SQL语句where条件中的各个字段间彼此是独立没有关联关系的,所以对于AND连接的各列,where条件的组合选择率就是各个字段经过各自谓词过滤后的可选择率的乘积。...,但是表中的数据分布并不一定是严格按照各个字段的选择率来分布的。...创建age + boyfriend组合索引 从执行计划中可以看到在索引的前缀字段age传入的是范围值的情况下,后缀字段boyfriend='no'会在access和filter中都出现(access方式是指根据该行执行计划的执行方式去定位记录...那么为什么boyfriend='no'会同时出现在access和filter中呢?...创建boyfriend + age组合索引 索引的前缀字段boyfriend是等值,后缀字段age也可以走上索引的access扫描方式,对比age + boyfriend组合索引逻辑读、执行时间降低明显

    91740

    DELETE选错执行计划的困境

    ,一个简单的DELETE SQL语句: 执行缓慢,不巧,此类型的SQL语句在公司生产系统中出现过问题,导致某B2C网站交易严重超时,所以再次做了一次模拟实验,分析并回顾一下这个SQL优化过程的来龙去脉...该SQL的索引情况与选择度概览,PID,CNAME,CTYPE存在组合索引,并且为主键,PID有单独存在的索引TRAVELSKYDBA_IDX01,选择率如下图: ? ?...CBO默认选择了CTYPE,CNAME,PID三列的组合主键索引,也就是最后再去过滤的PID,可是,随之产生了疑问,为什么不选择PID上的索引先行ACCESS呢?PID上的索引选择度理论上是更好的。...当语句是DELETE语句(对SELECT语句不适用)的时候,Oracle将不考虑需要回表(出现table access by index rowid)的索引,即favored index only range...可以看到SELECT时可以选择正确的索引,也就是说当遇到DELETE时,WHERE条件存在选择性好的字段,该字段存在索引,但索引不包含where其他字段时会触发此问题。

    53740

    group by 和聚合函数

    分析: 在mysql中没有强调select指定的字段必须属于group by后的条件。若符合条件的字段有多个,则只显示第一次出现的字段。...也就是查询的结果是不确定的,hash?这可能涉及到在磁盘的存储等等,这里不去深究。因此,并不能确认第一次查出来的字段的值,而且分组后不是条件的值被合并后没有意义。...4.添加聚合函数 聚合函数有如下几种: 函数 作用 支持性 sum(列名) 求和 max(列名) 最大值 min(列名) 最小值 avg(列名) 平均值 first(列名) 第一条记录 仅Access...支持 last(列名) 最后一条记录 仅Access支持 count(列名) 统计记录数 注意和count(*)的区别  首先,要明白聚合函数的用法。...比如,count(列字段值),统计该字段值出现的次数: 1 SELECT name,COUNT(*) 2 from person 3 GROUP BY name; 结果为: ? 。

    2.1K110

    【数据库】SQL零基础入门学习

    但是由于各种各样的数据库出现,导致很多不同版本的 SQL 语言。...SQL 面向数据库执行查询 SQL 可从数据库取回数据 SQL 可在数据库中插入新的记录 SQL 可更新数据库中的数据 SQL 可从数据库删除记录 SQL 可创建新数据库...因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引) 14、说明:前10条记录 select top...10 * form table1 where 范围 15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等....,这种做法不适合大容量但数据操作3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter

    14110

    SQL中Group By的使用,以及一些特殊使用方法

    在Access中不可以使用“order by 数量之和 desc”,但在SQL Server中则可以。...Access中是不支持“Group By All”的,但Access中同样支持多列分组,上述SQL Server中的SQL在Access可以写成 select 类别, 摘要, sum(数量) AS 数量之和...from A group by 类别, 摘要 7、Group By与聚合函数 在示例3中提到group by语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中...,常见的聚合函数如下表: 函数 作用 支持性 sum(列名) 求和 max(列名) 最大值 min(列名) 最小值 avg(列名) 平均值 first(列名) 第一条记录 仅Access支持 last...(列名) 最后一条记录 仅Access支持 count(列名) 统计记录数 注意和count(*)的区别 示例5:求各组平均值 select 类别, avg(数量) AS 平均值 from A group

    2.7K20

    MySQL-explain笔记

    index 和全表扫描一样,只是扫描的索引,主要优点就是避免了排序。 range 范围扫,仅检索给定范围内的行。 ref 对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。...仅索引扫描(index-only)通常比全表扫描(ALL)更快,因为索引的大小通常小于表数据。 使用对索引的读取执行全表扫描,以按索引顺序查找数据行。 Uses index不会出现在Extra列中。...key_len 值能够使你判定 MySQL 实际使用了 multiple-part key 中的多少个 part,即在组合索引里面可以更清楚的了解到了哪部分字段使用到了索引。...,占1字节(非空字段此标记不占用字节) S:索引列字段是否定长(int、char、datetime为定长,varchar为不定长),不定长字段类型需记录长度信息,占2字节 9. ref 显示了之前的表在...5.6.x之后引入的优化子查询的新特性之一,在in()类型的子查询中,子查询返回的可能有重复记录时,就可能出现这个。

    2.3K10

    Oracle查看分析执行计划、建立索引以及SQL优化

    ,每次至多只返回一条记录; 表中某字段存在 UNIQUE、PRIMARY KEY 约束时,Oracle常实现唯一性扫描; b) INDEX RANGE SCAN(索引范围扫描): 使用一个索引存取多行数据...,还包含左边表中的全部记录。...,还包含右边表中的全部记录。...因此必须选择记录条数最少的表放在右边。   ③对于Where字句其执行顺序是从后向前执行、因此可以过滤最大数量记录的条件必须写在Where子句的末尾,而对于多表之间的连接,则写在之前。...,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。

    4.1K20

    Mssql常用经典SQL语句大全完整版–详解+实例

    a.排序字段   14、说明:前10条记录 select top 10 * form table1 where 范围   15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜...case可以方便地实现多重选择,类似select 中的case。...随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)   对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。...再谈随机数   现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。...ID,LASTNAME两个字段的数据是完整的 现在要把表 B中的LASTNAME字段的相应的数据填入到A表中LASTNAME相应的位置。

    1.3K10

    常用但容易忘记的sql语句(sql server为主)

    1.说明:随机取出10条数据 a.Sql Server: select top 10 * from tablename order by newid() b.Access: Select TOP 10...,在SQL语句组合时用的较多 “where 1=1” 是表示选择全部 “where 1=2”全部不选 3.数据库加密(sql server数据库): select encrypt('原始密码')...Top M ID From 表) Order by ID Desc 案例   例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录...select top 10 recid from A where……是从索引中查找,而后面的select top 30 recid from A则在数据表中查找, 这样由于索引中的顺序有可能和数据表中的不一致...解决方案   1, 用order by select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题   2, 在那个子查询中也加条件:select

    93290

    SQL索引优化

    具体到方法上,就必须熟悉数据库应用程序中的所有SQL语句,从中统计出常用的可能对性能有影响的部分SQL,分析、归纳出作为Where条件子句的字段及其组合方式;在这一基础上可以初步判断出哪些表的哪些字段应该建立索引...4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 5、索引应该建在选择性高的字段上; 6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 7、复合索引的建立需要进行仔细分析...;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?...但是如果表非常有顺序,那么如果查询的记录数大于40%时,可能使用全表扫描更快。因此,有一个索引范围扫描的总体原则是: 1)对于原始排序的表 仅读取少于表记录数40%的查询应该使用索引范围扫描。...反之,读取记录数目多于表记录数的40%的查询应该使用全表扫描。 2)对于未排序的表 仅读取少于表记录数7%的查询应该使用索引范围扫描。

    1.1K80

    这是我见过最有用的Mysql面试题,面试了无数公司总结的(内附答案)

    SELECT:从数据库中选择特定数据 INSERT:将新记录插入表中 UPDATE:更新现有记录 DELETE:从表中删除现有记录 15. SQL中有哪些不同的DCL命令?...简短的答案是“否”,一个表不允许包含多个主键, 但是它允许一个包含两个或更多列的复合主键。 41.什么是复合 主键? 复合主键是在表中的多个列(多个字段的组合)上创建的主键。 42.什么是外键?...用字段NULL值是没有值的字段。甲NULL值是从零值或包含空格的字段不同。 具有NULL值的字段是在记录创建过程中留为空白的字段。...NOT NULL约束用于确保字段中的值不能为NULL 49.什么是CHECK约束? CHECK约束用于限制一列或多列接受的值。 例如,“年龄”字段应仅包含大于18的值。...DELETE from Players WHERE Player_Name = ‘Sachin’ 86.如何从一个employee表中仅一次获取每个名字?

    27.1K20

    SQL命令 DISTINCT

    但是,如果将文字指定为逗号分隔列表中的项值,则该文字将被忽略,并且DISTINCT将为指定字段名的每个唯一组合选择一行。 DISTINCT子句在TOP子句之前应用。...简单查询中没有意义,因为在这种类型的嵌入式SQL中,SELECT始终只返回一行数据。...DISTINCT和GROUP BY DISTINCT和GROUP BY这两个记录按指定字段(或多个字段)分组,并为该字段的每个唯一值返回一条记录。...如果SELECT不包含FROM子句,则DISTINCT是合法的,但没有意义。 聚合函数:可以在聚合函数中使用DISTINCT子句,以仅选择要包含在聚合中的不同(唯一)字段值。...CLOSE EmpCursor3 ) } 查询行为的这种更改仅适用于基于游标的嵌入式SQL SELECT查询。

    4.4K10

    执行计划中各字段各模块描述

    在SQL语句的执行计划中,包含很多字段项和很多模块,其不同字段代表了不同的含义且在不同的情形下某些字段、模块显示或不显示,下 面的描述给出了执行计划中各字段的含义以及各模块的描述。       ...有关执行计划中各字段模块的描述请参考: 执行计划中各字段各模块描述        有关由SQL语句来获取执行计划请参考:     使用 EXPLAIN PLAN 获取SQL语句执行计划        ...函数的使用 一、执行计划中各字段的描述 1、基本字段(总是可用的)         Id                 执行计划中每一个操作(行)的标识符。...这个字段必须扩大1024倍才能和其他衡量内存的字段一致(比如,32k意味着32MB) 二、执行计划中各模块的描述与举例 1、预估的执行计划中的各字段与模块 SQL> explain plan for...--SQL语句的执行计划,可以看到下面显示的字段一部分不同于预估执行计划中的字段 --------------------------------------------------------

    49540

    SQL之美 - 分页查询的排序问题

    (FULL) OF 'TEST' (Cost=20 Card=6363 Bytes=165438) 对比这次的结果和第一次的结果,就会发现ID为6235的数据出现了两次。...第一次在前10条返回记录中,6235出现了,而第二次在11到第20条记录中,6235又出现了。一条数据重复出现两次,就必然意味着有数据在两次查询中都不会出现。...在这个例子中,OWNER列包含了大量键值为CCC的数据,而且Oracle的排序算法不具有稳定性,因此前10行记录和前20行记录中键值的顺序不能保证一致。...因此,就造成某些数据会重复出现,而有些数据不会出现的现象。 解决这个问题其实也很简单。有两种方法可以考虑。 一,在使用不唯一的字段排序时,后面跟一个唯一的字段。...(FULL) OF 'TEST' (Cost=20 Card=6363 Bytes=165438) 这种方式由于采用表数据的全排序,每次只取全排序中的某一部分数据,因此不会出现上面提到的重复数据问题。

    1.7K60

    经典SQL语句大全

    by a.排序字段 前10条记录 select top 10 * form table1 where 范围 选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜...,这种做法不适合大容量的数据操作 3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段...--- 技巧 1=1,1=2的使用,在SQL语句组合时用的较多 “where 1=1” 是表示选择全部 “where 1=2”全部不选, 如: if @strWhere !...记录搜索 案例 例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录。...SET NOCOUNT 为 OFF 时,返回计数 常识 在SQL查询中:from后最多可以跟多少张表或视图:256 在SQL语句中出现 Order by,查询时,先排序,后取 在SQL中,一个字段的最大容量是

    3.1K30

    后端必备:15000 字的 SQL 语句大全

    ,这种做法不适合大容量但数据操作3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter...三、技巧 1、1=1,1=2的使用,在SQL语句组合时用的较多 “where 1=1” 是表示选择全部    “where 1=2”全部不选, 如: if @strWhere !...Select Top N * From 表 Order by ID Desc 案例例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录...SET NOCOUNT 为 OFF 时,返回计数 常识 在SQL查询中:from后最多可以跟多少张表或视图:256 在SQL语句中出现 Order by,查询时,先排序,后取 在SQL中,一个字段的最大容量是...从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导 (2) [下一步] 选择分发服务器 可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己)

    1.8K20

    肝通宵写了三万字把SQL数据库的所有命令,函数,运算符讲得明明白白讲解,内容实在丰富,建议收藏+三连好评!

    如果要选择表中的所有可用字段,请使用以下语法: SELECT * FROM table_name; 假设我们已经有一个数据库Customers如下: SELECT 列示例 以下 SQL 语句从...SELECT DISTINC Country FROM Customers; WHERE 查询定位 子句 该WHERE子句用于过滤记录。它用于仅提取满足指定条件的记录。...CustomerID 列是一个自动递增字段,将在新记录插入表中时自动生成。...如果表中的字段是可选的,则可以在不向该字段添加值的情况下插入新记录或更新记录。然后,该字段将保存为 NULL 值。 注意: NULL 值不同于零值或包含空格的字段。...的记录(用于 SQL Server/MS Access): SELECT TOP 50 PERCENT * FROM Customers; Oracle 的等效示例: SELECT * FROM Customers

    9.9K20
    领券