当前位置:首页 > 生活百科

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

栏目:生活百科日期:2025-02-02浏览:0

使用 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 使用关联查询优化

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

SELECT    id, name, priceFROM filmINNER JOIN (    SELECT id    FROM film    LIMIT 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 clauseGROUP BYDISTINCTAggregationLIMIT or OFFSET

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

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

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

“sql默认值怎么设置(sql给字段添加默认值)” 的相关文章

如何开网店淘宝店,新手开店费用明细及流程分享

新手开淘宝店,请先不要想自己能赚多少钱。首先应该想的事是,如果我不成功,我会损失什么?这些东西我是否可以承受?如果可以,再放开手去;今天我们就从货源和店铺流程两...

4g路由器好用吗,华为4g路由器2评测

前几天,单位互联网突然瘫痪,碰巧当天要开视频会议与上报材料,办公用的全是台式机,大家都一筹莫展。最后是我从家里把&”蒲公英X44G无线路由器&&#8...

28才开始创业晚不晚,听听他们是如何积累第一桶金的

85后清华博士创办了“理财范”交易金额突破50亿元,博士、连续创业、霸屏BOSS&…&…当这些标签叠加在一个人身上会发生什么?85后的家...

华凌热水器质量怎么样(全方位介绍华凌热水器品质)

一、前言各位好,我是abrams2415。自从2013年装修开始,家里的燃气热水器至今还有几个月就8年了。而国家对燃气热水器强制报废年限正是8年。虽然到目前为止...

dnfsf辅助破解版(dnf公益服gm权限通用)

摘要:一个朋友发了一个dnf台服给我,让我和他一起玩,现在这种自己搭建的SF太多了,不过大多数都是坑,想玩得爽还是得充钱(再冲10万,你会变得更强)当然我等屌丝...

保卫萝卜挑战27关攻略(讲解保卫萝卜boss模式)

保卫萝卜3战斗考验和其他的挑战模式副本一样布局会随机,每天进入的三次机会都会来到不同的界面布局中,那么面对这样的玩法要有哪些技巧才可以尽快清除怪物呢?目标是规定...

4k硬屏好还是软屏好(两种屏幕优劣对比)

你有没有听说,硬屏比软屏好,LG的屏幕更好这样的言论?在实体店看电视的时候,是不是有些导购会直接告诉你“我们这款电视采用LG原装进口屏”?是不是隐约记得,软屏和...

ips和va屏幕哪个好(ips屏幕和led屏幕区别)

最近618有活动,对攒机的小伙伴来说是个机会。我买了较色仪之后,清楚的感觉到,自己的显示器不给力,准备换个显示器。一点浅显的体会,分享给大家。之后会带来我这段时...

realtek网卡驱动是什么(给电脑安装网卡驱动的方法)

RealtekRTL8723BEWirelessLAN802.11nPCI-ENIC支持以下协议:802.11b2.4GHzHR-DSSS11Mbps802.1...

excel工作表保护破解(查看工作表保护的密码)

在我们的日常工作中,工作表不希望同事改动内容,我们通常会在审阅的,保护工作表里面,设置一个密码这样同事打开你的工作表,只能查看数据,不能编辑改动,编辑会弹出警告...