总结来说:
SELECT
DISTINCT <select_list>
FROM <left_table>
<join_type> JOIN <right_table>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>
FROM<表名> # 选取表,将多个表数据通过笛卡尔积变成一个表。
ON<筛选条件> # 对笛卡尔积的虚表进行筛选
JOIN <join, left join, right join...>
<join表> # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中
WHERE<where条件> # 对上述虚表进行筛选
GROUP BY<分组条件> # 分组
HAVING<分组筛选> # 对分组后的结果进行聚合筛选,<SUM()等聚合函数> # 用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的
SELECT<返回数据列表> # 返回的单列必须在group by子句中,聚合函数除外
DISTINCT数据除重
ORDER BY<排序条件> # 排序
LIMIT<行数限制>
温馨提示:SQL优化策略适用于查询数据量较大或单表数据量较大的场景下,如果数据量较小,没必要以此为准。
示例如下:
select * from t_user t where t.name like '%周%'
优化建议:尽量在字段后面使用模糊查询
select * from t_user t where t.name like '周%'
优化建议和解释如下:
将 %周%
改为 '周%'
:在 SQL 查询中,尽量避免使用 %
作为 LIKE 操作符的开头,这样会导致数据库无法使用索引,强制数据库做全表扫描,影响查询性能。将 %周%
改为 '周%'
可以有效利用索引,提高查询性能。
添加索引:如果表 t_user 的 name 字段没有索引,可以考虑为 name 字段添加索引,从而加快 LIKE 操作的性能。在此案例中,由于 WHERE 子句中对 name 字段进行了模糊查询,添加索引可以显著提升查询性能。
示例如下:
select * from t_user t where t.id in (1, 2)
优化一建议:使用or 查询替换in 查询
select * from t_user t where t.id = 1 or t.id = 2
优化建议和解释:
原始的 SQL 查询语句使用了 IN 子句来查询指定的 id,而优化后的 SQL 查询语句使用 OR 来连接多个 id 的条件,这样数据库在执行查询时可以更有效地利用索引。
使用 OR 来连接多个 id 的条件可以让数据库优化器更好地进行索引选择,避免了 IN 子句可能导致的全表扫描。此外,OR 连接条件时也可以让优化器更好地使用联合索引。
因此,将 IN 子句替换为 OR 来连接多个条件是一个简单却有效的 SQL 查询优化方法。
优化二建议:如果是连续性数字,可以考虑使用between *** and 代替
select * from t_user t where t.id between 1 and 2
示例如下:
select * from t_user t where t.orgId in (select id from t_org o where o.isDelete = 1)
优化一建议:使用内联查询替换in 查询
select t.* from t_user t
join t_org o on t.orgId = o.id
where o.isDelete = 1
优化建议和解释:
优化二建议:使用existe 函数 替换 in 查询
select * from t_user t where exists (select 1 from t_org o where o.id = t.orgId and o.isDelete = 1)
示例如下:
SELECT * FROM t WHERE id = 1 OR id = 3
优化建议:使用union 代替or
SELECT * FROM t WHERE id = 1
UNION
SELECT * FROM t WHERE id = 3
示例如下:
SELECT * FROM t WHERE t.phone is null
优化建议:给字段添加默认值'',对字段取值=''进行判断。
SELECT * FROM t WHERE t.phone =''
示例如下:
SELECT * FROM t_score t WHERE t.score/10 = 9
优化建议:左侧表达式运算移动至右侧
SELECT * FROM t_score t WHERE t.score = 10*9
示例如下:
SELECT username, age, sex FROM t_user WHERE 1=1
优化建议:代码拼装sql时进行判断,没 where 条件就去掉 where 1= 1,有where条件就加 and。
SELECT username, age, sex FROM t_use
示例如下:
SELECT username, age, sex FROM T WHERE t.id != 1
优化建议:使用大于(>)操作符替换!=
SELECT username, age, sex FROM T WHERE t.id > 1
优化建议和解释如下:
尽量避免在 WHERE 子句中使用不等于(!=)操作符,因为对不等于操作符的查询往往需要进行全表扫描,性能较差。改为使用大于(>)操作符可以更好地利用索引。
示例如下:
SELECT username, age, sex FROM T WHERE t.username != 'root'
优化建议和解释如下:
考虑给关联字段(在本例中是 username 字段)添加索引:确保表 T 的 id 字段上有索引,可以加快查询速度。
示例:复合(联合)索引包含key_part1,key_part2,key_part3三列,但SQL语句没有包含索引前置列"key_part1",按照MySQL联合索引的最左匹配原则,不会走联合索引。
select * from table where key_part2=1 and key_part3=2
SQL语句由于索引对列类型为varchar,但给定的值为数值,涉及隐式类型转换,造成不能正确走索引。
select * from table where col_varchar=123;
-- 不走age索引
SELECT * FROM t order by age;
-- 走age索引
SELECT * FROM t where age > 0 order by age;
MySQL中可以使用hint指定优化器在执行时选择或忽略特定的索引。
特别是针对主从复制这类业务场景,由于原理上从库复制的是主库执行的语句,使用如now()、rand()、sysdate()、current_user()等不确定结果的函数很容易导致主库与从库相应的数据不一致。
在MySQL中,执行 from 后的表关联查询是从左往右执行的(Oracle相反),第一张表会涉及到全表扫描,所以将小表放在前面,先扫小表,扫描快效率较高,在扫描后面的大表,或许只扫描大表的前100行就符合返回条件并return了。
示例:表1有1000条数据,表2有500万条数据;如果全表扫描表2,SQL会提示超时异常。
当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个列名上。减少列名歧义引起的语法错误。
MySQL采用从左往右,自上而下的顺序解析where子句。根据这个原理,应将过滤数据多的条件往前放,最快速度缩小结果集。
如果同时执行大量的插入,建议使用批量插入INSERT语句,这比循环插入INSERT语句快,性能提示主要体现减少与MySQL 服务器交互次数。
在实际业务开发中经常出现的更新行同时又希望获得改行信息的需求,MySQL并不支持PostgreSQL那样的update teturning语法,在MySQL中可以通过变量实现。
示例如下:更新一行记录的时间戳,同时希望查询当前记录中存放的时间戳。
Update t set time=now() where id=1;
Select time from t where id =1;
优化建议:使用MySQL变量,重写上述功能
Update t set time=now () where id =1 and @now: = now ();
Select @now;
前后二者都需要两次网络来回,但使用变量避免了再次访问数据表,特别是当t表数据量较大时,后者比前者快很多。
MySQL 允许改变语句调度的优先级,它可以使来自多个客户端的查询更好地协作,这样单个客户端就不会由于锁定而等待很长时间。改变优先级还可以确保特定类型的查询被处理得更快。我们首先应该确定应用的类型,判断应用是以查询为主还是以更新为主的,是确保查询效率还是确保更新的效率,决定是查询优先还是更新优先。下面我们提到的改变调度策略的方法主要是针对只存在表锁的存储引擎,比如 MyISAM 、MEMROY、MERGE,对于Innodb 存储引擎,语句的执行是由获得行锁的顺序决定的。MySQL 的默认的调度策略可用总结如下:
如果写入操作是一个 LOW_PRIORITY(低优先级)请求,那么系统就不会认为它的优先级高于读取操作。在这种情况下,如果写入者在等待的时候,第二个读取者到达了,那么就允许第二个读取者插到写入者之前。只有在没有其它的读取者的时候,才允许写入者开始操作。这种调度修改可能存在 LOW_PRIORITY写入操作永远被阻塞的情况。
SELECT 查询的HIGH_PRIORITY(高优先级)关键字也类似。它允许SELECT 插入正在等待的写入操作之前,即使在正常情况下写入操作的优先级更高。另外一种影响是,高优先级的 SELECT 在正常的 SELECT 语句之前执行,因为这些语句会被写入操作阻塞。如果希望所有支持
LOW_PRIORITY 选项的语句都默认地按照低优先级来处理,那么 请使用--low-priority-updates 选项来启动服务器。通过使用 INSERTHIGH_PRIORITY 来把 INSERT 语句提高到正常的写入优先级,可以消除该选项对单个INSERT语句的影响。
默认情况下,MySQL 会对GROUP BY分组的所有值进行排序,如 “GROUP BY 字段1,字段2,....;” MySQL 同时开启隐藏排序,如 “ORDER BY 字段1,字段2,...;”
查询如果包括 GROUP BY 但你并不想对分组的值进行排序,你可以指定 ORDER BY NULL禁止排序。示例如下:
SELECT 字段1, 字段2, COUNT(*) FROM table GROUP BY 字段1, 字段2 ORDER BY NULL ;
MySQL中通过子查询使用 SELECT 语句来实现一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的 SQL 操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,有些情况下,子查询可以被更有效率的连接(JOIN)替代。
示例如下:
select * from t_user t where t.orgId in (select id from t_org o where o.isDelete = 1)
优化一建议:使用内联查询替换in 查询
select t.* from t_user t
join t_org o on t.orgId = o.id
where o.isDelete = 1
MySQL通过创建并填充临时表的方式来执行union查询。除非确实要消除重复的行,否则建议使用union all。原因在于如果没有all这个关键词,MySQL会给临时表加上distinct选项,这会导致对整个临时表的数据做唯一性校验,这样做的消耗相当高。
示例如下:
select id, name, age t where t.id= 1
union
select id, name, age b where b.id= 2
优化建议:
select id, name, age t where t.id= 1
union all
select id, name, age b where b.id= 2
当删除全表中记录时,使用delete语句的操作会被记录到undo块中,删除记录也记录binlog,当确认需要删除全表时,会产生很大量的binlog并占用大量的undo数据块,此时既没有很好的效率也占用了大量的资源。
使用truncate替代,不会记录可恢复的信息,数据不能被恢复。也因此使用truncate操作有其极少的资源占用与极快的时间。另外,使用truncate可以回收表的水位,使自增字段值归零。
使用合理的分页方式以提高分页效率 针对展现等分页需求,合适的分页方式能够提高分页的效率。
select * from t
where id = 10000 and is_deleted = 0
order by create_time asc
limit 0, 15
该种写法缺陷:越翻到后面执行效率越差,时间越长,尤其表数据量很大的时候。
优化建议:
select t.* from (select id from t where t.id = 10000 and t.is_deleted = 0
order by t.create_time asc limit 0, 15) a, t
where a.id = t.id;
尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。
文章浏览阅读9.6k次,点赞5次,收藏20次。有时候我们希望实现点击一段div内文本时就能直接进行编辑,当然使用文本框、富文本等也可以实现,但终究有些麻烦。目录效果预览参数介绍封装与使用使用效果差异plaintext-only 的效果使用contenteditable = "true" 的效果效果预览今天我给大家介绍的这种方式是直接使用div的 contenteditable属性,即可实现div的文本编辑..._plaintext-only
文章浏览阅读8.1k次,点赞41次,收藏61次。对标大厂标准CSDN能力认证 and 超级实习生-大厂实习直通车详情介绍!!!_csdn认证
文章浏览阅读772次。public static void InvokeSystemPS(string cmd) { List<string> ps = new List<string>(); ps.Add("Set-ExecutionPolicy RemoteSigned"); ps..._system.management.automation
文章浏览阅读1.1k次。图标介绍⌘Command⇧Shift⇪Caps Lock⌥Option = Alt⌃ControlEnter⌫Delete⌦Fn + Delete↑上箭头↓下箭头←左箭头→右箭头⇞Fn + ↑ = Page Up⇟Fn + ↓ = Page DownHomeFn + ←EndFn + →⇥Tab = 右制表符⇤Shift + Tab = 左制表符..._苹果电脑箭头符号是哪个键
文章浏览阅读1.8w次,点赞11次,收藏62次。相机在计算机视觉应用中起着重要作用,作为图像数据来源,影响着后续各个处理步骤。成像模型就是用数学公式刻画整个成像过程,即被拍摄物体空间点到照片成像点之间的几何变换关系。总体上,相机成像可以分为四个步骤:刚体变换、透视投影、畸变校正和数字化图像。 一、刚体变换(从世..._相机成像模型的建立
文章浏览阅读1.6w次,点赞11次,收藏14次。Lottie主要类图:Lottie对外通过控件LottieAnimationView暴露接口,控制动画。LottieAnimationView继承自ImageView,通过当前时间绘制canvas显示到界面上。这里有两个关键类:LottieComposition 负责解析json描述文件,把json内容转成Java数据对象;LottieDrawable负责绘制,把LottieCompo..._lottie json解析
文章浏览阅读6.4k次,点赞4次,收藏32次。系统:Ubuntu16.04python版本:python2.7内核版本:4.13.0realsense SDK:librealsense1.12.1python wrapper:pyrealsense2.2这里的pyrealsense2.2指的是pyrealsense1的2.2版本,并不是pyrealsense2,如图:安装pyrealsense/2.21. 进入..._pyrealsense2深度值
文章浏览阅读2.3k次,点赞15次,收藏75次。这是之前学习kali linux的学习笔记的目录_kali 高通cpu密钥认证证书提取
文章浏览阅读886次。1首先建立模块等一系列的文件,文件2etc/config.xml文件:1.10standardRichardMason_编写模块读取数据库数据
文章浏览阅读489次,点赞3次,收藏7次。虚拟机中安装一下达梦数据库,并且以后大家都连接你虚拟机中达梦数据库进行开发。。。。。。在不改动自己虚拟机配置,以及本地网卡任何配置的情况下如何解决?本虚拟机网络一直使用的NAT模式。
文章浏览阅读5.3k次。字符串的大小写转换操作:upper():把字符串中所有字符都转换成大写字母,转换的结果是新的字符串对象(即id不同)lower():把字符串中所有字符都转换成小写字母,转换的结果是新的字符串对象(即id不同)swapcase():把字符串中所有小写字母都转换成大写字母,把字符串中所有大写字母都转换成小写字母,转换的结果是新的字符串对象(即id不同)capitalize():把第一个字符转换为大写,把其余字符转换为小写,转换的结果是新的字符串对象(即id不同)title():把每个单词的第一个字符_python将一个字符串小写字母转化成大写字母
文章浏览阅读936次。计算机的脆弱性主要包含在那几个方面呢?佰佰安全网是如何对这个问题进行解答的吧。当我们了解了计算机网络的脆弱性我们就能很好的回答计算机网络安全的问题了哦。计算机的脆弱性主要表现在:存储数据的密度极高。在一块磁盘、光盘或磁带中,可以存储大且数据信息,而这些存储介质很容易被带出办公室,也很容易受意外损坏。数据泄露。计算机工作时辐射出电磁波,任何人都可借助并不复杂的设备在一定的范围内收到它,从而造成信息泄..._电脑用户的脆弱账号是什么意思