77百科网
当前位置: 首页 生活百科

sql默认值怎么设置(sql给字段添加默认值)

时间:2023-06-29 作者: 小编 阅读量: 1 栏目名: 生活百科

SELECTid,name,priceFROMfilmINNERJOINASLIMUSING复制代码1.2.2使用范围查询有时候可以将LIMIT转化为已知位置的查询,让MySQL通过范围扫描获得到对应的结果。

使用 limit 优化查询和防止SQL被优化

Table of Contents

查询优化

1.1 最大值和最小值的优化

对于 MIN() 和 MAX() 查询, MySQL 而且优化做得并不是太好,例如

select MIN(id) FROM film where name = '西游记';复制代码

假设表 film 数据如下:

其中 id 为主键并自增, name 为 varchar 且没有索引

因为 name 没有索引,因为 MySQL 将会进行一次全表扫描。因为 id 为自增,那么我们可以当作,第一次找到 name=’西游记’ 时, id 就为我们想要的结果,此时我们可以改写 SQL 问:

select id FROM film where name = '西游记' limit 1;复制代码

此时当查到第一条记录时,就会停止继续查询,获得更高的性能。

1.2 优化 limit 分页

在系统进行分页操作的时候,当偏移量大时,例如: limit 10000,20 时, MySQL 需要查询 10020 条记录然后只返回 20 记录,前面的记录全部被舍弃,这样的代价非常高

SELECT id, name, price FROM file LIMIT 10000 OFFSET 20复制代码

上面的 SQL 我想是分页常规的写法,写法没有什么错误,正如上面说到,浪费了大量的性能。

1.2.1 使用关联查询优化

优化此类查询一个简单的方法就是尽可能地使用索引覆盖扫描,而不是查询所有的列,然后根据需要做一次关联操作再返回所需的列。对于偏移大的时候,这样做的效率提升非常大。

SELECTid, name, priceFROM filmINNER JOIN (SELECT idFROM filmLIMIT 10000 OFFSET 20) AS LIM USING(id)复制代码

1.2.2 使用范围查询

有时候可以将 LIMIT 转化为已知位置的查询,让 MySQL 通过范围扫描获得到对应的结果。例如,如果在一个位置列上有索引,并且预先计算出了边界值,则改写查询为:

SELECT id, name, priceFROM filmWHERE position BETWEEN 10000 AND 10020ORDER BY position复制代码

1.2.3 利用唯一自增序列进行查询

这里的唯一自增序列可以是自增 id 主键,也可以其他的具有唯一和升序的数字即可

在前面的思路中,我们考虑的都是传入页数和每页数量,在一些操作中可以改为传入上一次查询到的自增序列,然后往后查询对应的每页数量即可。

例如原来要求前端传入页数(pageIndex)和 每页数量(pageSize), 此时的 SQL 为

select * from film limit (pageIndex -1) * pageSize OFFSET pageIndex * pageSize复制代码

如果改为让前端传入最后一次查询到结果的 自增序列(sid) 和 每页数量(pageSize)

比如这时的自增序列(sid) 就是 film 的 id, 则 SQL 可以改写成

select * from film where id > sidlimit pageSize复制代码

当查第一页的时候,sid 传入 0 即可,查第二页的时候,传入获取第一页时最后得到 id 即可

防止被优化

在写 SQL 的时候,除了要考虑优化 SQL 降低执行时间外,有时还要防止 SQL 被 MySQL 本身给你优化掉,造成执行结果和你想象的不一样。

在 MySQL 使用 group by 语句进行查询时,当有多条数据都满足时,会显示第一条数据例如:

假设表 film 数据如下:

则执行SQL select * from film group by name , 则结果为:

但在一些数据重复时,我们往往想要最后一条数据, 这是我们会想到通过子查询的形式先排序后group by 如下:

select *from ( select * from film order by id desc) as film_orderedgroup by name;复制代码

执行后发现结果没变, 这是因为 MySQL5.7 会对子查询进行优化,认为子查询中的 order by 可以进行忽略,只要Derived table里不包含如下条件就可以进行优化:

  • UNION clause
  • GROUP BY
  • DISTINCT
  • Aggregation
  • LIMIT or OFFSET

根据上面说明,我们可以使用 limit 阻止子查询优化,改写后SQL

select *from ( select * from film order by id desc limit 10000000) as film_orderedgroup by name;复制代码

这样结果就符合我们想要的了

    推荐阅读
  • 两个电子表格如何对比(两个电子表格如何对比找出相同内容)

    两个电子表格如何进行对比首先打开两个需要对比的表格文件。即可在同一个页面对比两个表格了。还可点击同步滚动按钮。选择是否需要两个表格同步滚动。

  • 韩滉五牛图私藏(从容自信的五牛)

    但是,韩滉《五牛图》却始终有一种后世牛画作品所无法超越的高度。作为官员的韩滉,从入仕的那一刻起,就希望自己能够成为一名有作为的官员。同时,这头牛的背部凸起也是四头牛中最为明显的。第三头牛是画面中居中的一头牛,也是唯一身体正向面对观者的一头牛。韩滉出于构图的需要,让两边各两头牛以这头牛为中心进行布局。《五牛图》中的五头牛,从右至左,便如同人所经历的一生。这句话用来评说韩滉的《五牛图》是再好不过的了。

  • 关于小雪最著名的古诗(小雪檐飞数片雪)

    关于小雪最著名的古诗小雪,是二十四节气中的第20个节气。小雪是反映降水与气温的节气,它是寒潮和强冷空气活动频数较高的节气。小雪节气的到来,意味着天气会越来越冷、降水量渐增。小雪[宋]苏辙小雪仅能消膈热,苦寒偏解恼衰翁。小雪[宋]陆游夜卧风号野,晨兴雪拥篱。此日长安酒,旗高未易赊。

  • 精华液广告(精华液之营销骗局)

    说到欧莱雅集团的两款小黑瓶精华,我相信没人不知道吧?这个时候就有很多人不明白了,为什么价格贵那么多的兰蔻小黑瓶无论从总成分,还是综合功效成分上来看,都比不过200出头的欧莱雅小黑瓶呢?接下来我们直接来做下欧莱雅小黑瓶的成分解析。

  • 体脂率怎么测(怎么测体脂)

    怎么测体脂体脂率是指人体内的脂肪含量在人总体中所占的比例,也就是体脂的百分数一般体脂率的计算是用体脂率等于脂肪的重量除以体重,然后乘以100%,那么体脂率怎么样测呢?首先可以使用体质秤或者是手握仪器进行检测,其。

  • 四面体的宝石有哪种(庞大的宝石家族中)

    四祖母绿祖母绿是绿色宝石之中最具特色的一种,因此也被称为蓝宝石之王,在国际上钻石、红蓝宝石、祖母绿是公认的四大名贵宝石。六翡翠目前绝大多数优质的翡翠都是产自缅甸的,翡翠的硬度虽没有钻石高,可它的承压性比钻石大的多所以也被誉为自然界承压性最大的宝石之一,它有巨大韧性。因为中国人的喜欢,世界华侨也大力追捧,所以翡翠也跻身于世界宝石之列。

  • 我们相信明天会更好(让我们期待明天会更好)

    巴士上走下60名当红的歌手,他们主要来自亚洲各地。当然,据说其中很多唱片公司还是因为公益原因,欣然同意旗下歌手出席的。但是,目前没有证据显示,让罗大佑作曲是张艾嘉的主意。9月中旬,罗大佑回到台北,参与制作《明天会更好》。据说,在整个制作期间,张罗两人几乎没有互动。毫无疑问,这种专辑的另一个功臣是罗大佑的前女友张艾嘉,她担任了这个活动的总召集人。

  • 大连最好的高中是什么学校(大连4所高中成为新一批省示范)

    11月26日,辽宁省教育厅印发《关于公布2019年省示范性普通高中、省特色普通高中评估认定结果的通知》,辽宁省新增省示范性普通高中6所,省特色普通高中12所。优质特色普通高中资源进一步扩大。

  • 中秋十五的月亮圆又圆(十五的月亮十五圆)

    2022年9月10日晚,中秋限量满月上线。