掌握这个优化方法,你就无敌了!char索引

SELECT*FROMuser

2、正例

SELECTid,username,telFROMuser

3、理由

SELECT*FROMuserWHEREid=1ORsalary=5000

2、正例

(1)使用union all

SELECT*FROMuserWHEREid=1

UNIONALL

SELECT*FROMuserWHEREsalary=5000

(2)分开两条SQL写

SELECT*FROMuserWHEREid=1

SELECT*FROMuserWHEREsalary=5000

3、理由

2、理由

`address`char(100)DEFAULTNULLCOMMENT'地址'

2、正例

`address`varchar(100)DEFAULTNULLCOMMENT'地址'

3、理由

比如,存储字符串“101”,对于char(10),表示你存储的字符将占10个字节(包括7个空字符),在数据库中它是以空格占位的,而同样的varchar2(10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。

2、char的效率比varchar2的效率稍高。3、何时用char,何时用varchar2?

char和varchar2是一对矛盾的统一体,两者是互补的关系,varchar2比char节省空间,在效率上比char会稍微差一点,既想获取效率,就必须牺牲一点空间,这就是我们在数据库设计上常说的“以空间换效率”。

varchar2虽然比char节省空间,但是假如一个varchar2列经常被修改,而且每次被修改的数据的长度不同,这会引起“行迁移”现象,而这造成多余的I/O,是数据库设计中要尽力避免的,这种情况下用char代替varchar2会更好一些。

char中还会自动补齐空格,因为你insert到一个char字段自动补充了空格的,但是select后空格没有删除,因此char类型查询的时候一定要记得使用trim,这是写本文章的原因。

如果开发人员细化使用rpad技巧将绑定变量转换为某种能与char字段相比较的类型(当然,与截断trim数据库列相比,填充绑定变量的做法更好一些,因为对列应用函数trim很容易导致无法使用该列上现有的索引),可能必须考虑到经过一段时间后列长度的变化。如果字段的大小有变化,应用就会受到影响,因为它必须修改字段宽度。

正是因为以上原因,定宽的存储空间可能导致表和相关索引比平常大出许多,还伴随着绑定变量问题,所以无论什么场合都要避免使用char类型。

SELECT*FROMuserWHEREageISNOTNULL

2、正例

SELECT*FROMuserWHEREage>0

3、理由

SELECT*FROMuserWHEREsalary!=5000

SELECT*FROMuserWHEREsalary<>5000

2、理由

三种连接如果结果相同,优先使用inner join,如果使用left join左边表尽量小。

为什么?

先分组,再过滤

selectjob,avg(salary)fromemployee

groupbyjob

havingjob='develop'orjob='test';

2、正例

先过滤,后分组

selectjob,avg(salary)fromemployee

wherejob='develop'orjob='test'

groupbyjob;

3、理由

可以在执行到该语句前,把不需要的记录过滤掉

truncate table在功能上与不带 where子句的 delete语句相同:二者均删除表中的全部行。但 truncate table比 delete速度快,且使用的系统和事务日志资源少。

delete语句每次删除一行,并在事务日志中为所删除的每行记录一项。truncate table通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

truncate table删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 drop table语句。

对于由 foreign key约束引用的表,不能使用 truncate table,而应使用不带 where子句的 DELETE 语句。由于 truncate table不记录在日志中,所以它不能激活触发器。

truncate table不能用于参与了索引视图的表。

清空表数据可不是小事情,一个手抖全没了,删库跑路?如果加limit,删错也只是丢失部分数据,可以通过binlog日志快速恢复的。

2、SQL效率很可能更高

SQL中加了limit 1,如果第一条就命中目标return, 没有limit的话,还会继续执行扫描表。

3、避免长事务

delete执行时,如果age加了索引,MySQL会将所有相关的行加写锁和间隙锁,所有执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。

4、数据量大的话,容易把CPU打满

如果你删除数据量很大时,不加 limit限制一下记录数,容易把cpu打满,导致越删越慢。

5、锁表

一次性删除太多数据,可能造成锁表,会有lock wait timeout exceed的错误,所以建议分批操作。

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:

selectusername,telfromuser

union

selectdepartmentnamefromdepartment

这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。

INSERTINTOuser(id,username)VALUES(1,'编程');

INSERTINTOuser(id,username)VALUES(2,'妲己');

2、批量提交

INSERTINTOuser(id,username)VALUES(1,'编程'),(2,'妲己');

3、理由

默认新增SQL有事务控制,导致每条都需要事务开启和事务提交,而批量处理是一次事务开启和提交,效率提升明显,达到一定量级,效果显著,平时看不出来。

1、表连接不宜太多,一般5个以内

2、索引不宜太多,一般5个以内

SELECT*FROMuserWHEREDATE_ADD(birthday,INTERVAL7DAY)>=NOW;

2、正例

SELECT*FROMuserWHEREbirthday>=DATE_ADD(NOW,INTERVAL7DAY);

3、理由

使用索引列上内置函数,索引失效。

排序时应按照组合索引中各列的顺序进行排序,即使索引中只有一个列是要排序的,否则排序性能会比较差。

createindexIDX_USERNAME_TELonuser(deptid,position,createtime);

selectusername,telfromuserwheredeptid=1andposition='java开发'orderbydeptid,position,createtimedesc;

实际上只是查询出符合 deptid= 1 and position = 'java开发'条件的记录并按createtime降序排序,但写成order by createtime desc性能较差。

ALTERTABLEemployeeADDINDEXidx_name_salary(name,salary)

2、满足复合索引的最左特性,哪怕只是部分,复合索引生效

SELECT*FROMemployeeWHERENAME='编程'

3、没有出现左边的字段,则不满足最左特性,索引失效

SELECT*FROMemployeeWHEREsalary=5000

4、复合索引全使用,按左侧顺序出现 name,salary,索引生效

SELECT*FROMemployeeWHERENAME='编程'ANDsalary=5000

5、虽然违背了最左特性,但MySQL执行SQL时会进行优化,底层进行颠倒优化

SELECT*FROMemployeeWHEREsalary=5000ANDNAME='编程'

6、理由

复合索引也称为联合索引,当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。

联合索引不满足最左原则,索引一般会失效。

模糊查询,程序员最喜欢的就是使用like,但是like很可能让你的索引失效。

1、反例

select*fromcityswherenamelike'%大连'(不使用索引)

select*fromcityswherenamelike'%大连%'(不使用索引)

2、正例

select * from citys where name like '大连%'(使用索引)。

3、理由

2、Extra常用关键字

1、设计表的时候,所有表和字段都添加相应的注释。

2、SQL书写格式,关键字大小保持一致,使用缩进。

3、修改或删除重要数据前,要先备份。

4、很多时候用 exists 代替 in 是一个好的选择

5、where后面的字段,留意其数据类型的隐式转换。

未使用索引

SELECT*FROMuserWHERENAME=110

因为不加单引号时,是字符串跟数字的比较,它们类型不匹配;

MySQL会做隐式的类型转换,把它们转换为数值类型再做比较;

6、尽量把所有列定义为NOT NULL

NOT NULL列更节省空间,NULL列需要一个额外字节作为判断是否为 NULL的标志位。NULL列需要注意空指针问题,NULL列在计算和比较的时候,需要注意空指针问题。

7、伪删除设计

8、数据库和表的字符集尽量统一使用UTF8

9、select count(*) from table;

这样不带任何条件的count会引起全表扫描,并且没有任何业务意义,是一定要杜绝的。

10、避免在where中对字段进行表达式操作

11、关于临时表

12、索引不适合建在有大量重复数据的字段上,比如性别,排序字段应创建索引13、去重distinct过滤字段要少

14、尽量避免大事务操作,提高系统并发能力15、所有表必须使用Innodb存储引擎

Innodb「支持事务,支持行级锁,更好的恢复性」,高并发下性能更好,所以呢,没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎。

16、尽量避免使用游标

因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

THE END
0.SQL优化的15个小技巧,纯干货分享!本文通过100万条数据在MySQL上的测试,详细介绍了15种SQL优化方法,包括避免使用SELECT*,慎用UNION,小表驱动大表,以及LIKE语句、索引使用等优化策略,旨在提升SQL查询效率。 前言:这次准备了100W的数据进行SQL性能测试,数据库采用的是MySQL,总共介绍了常见的15种SQL优化方式,每一种优化方式都进行了实打实的测试,逐行讲解,jvzquC41dnuh0lxfp0tfv8MLYa8458ftvkimg8igvcomu86538977>7
1.mysqlSQL优化15种方法mysqlsql优化文章介绍了进行SQL优化的15种方法,包括避免使用select*,用unionall替代union,小表驱动大表策略,批量操作以减少数据库请求,多使用limit进行分页,控制IN操作中的值数量,以及优化分页和索引使用等,以提高SQL查询效率和程序性能。 该文章已生成可运行项目,预览并下载项目源码 jvzquC41dnuh0lxfp0tfv8|gkzooa=865382:8ftvkimg8igvcomu864;68:4A<
2.SQL优化常用的15种方法(SQL优化方法)数据库博客SQL的性能优化是数据库管理的重要任务,尤其是在处理大数据量的情况下,优化策略的合理使用能显著提高处理数据效率。本文将介绍SQL优化常用的15种方法,帮助开发者和管理人员改良数据管理的策略。 1方法1:使用合适的索引 索引优化是SQL优化的核心之一。为常用的查询字段创建索引,可以大幅提升查询速度。常用的索引类型包括唯一jvzquC41qrko0xhgcphbun3eqo5cnxl13:8429=;238
3.老司机总结的12条SQL优化方案(非常实用)腾讯云开发者社区(3)解析器/分析器: 分析器的工作主要是对要执行的SQL语句进行词法解析、语法解析,最终得到抽象语法树,然后再使用预处理器对抽象语法树进行语义校验,判断抽象语法树中的表是否存在,如果存在的话,在接着判断select投影列字段是否在表中存在等。 (4)优化器: 主要将SQL经过词法解析、语法解析后得到的语法树,通过数据jvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk0497897?
4.sql优化常用的几种方法SQL问题:常用的 SQL 优化方法有哪些? 答案:常用的 SQL 优化方法包括以下几种: 1. 索引优化 创建适当的索引以加速查询,减少表扫描。 删除不必要的索引以提高性能。 2. 查询优化 使用正确的查询类型(如 SELECT、INSERT、UPDATE)。 使用适当的 JOIN 条件。 jvzquC41yy}/rqu0ep5gcz4:57<8;7mvon
5.15个SQL优化的技巧sql优化常用的15种方法15个SQL优化的技巧 本文介绍了SQL查询性能优化的16条建议,包括不使用select *、用union all代替union、小表驱动大表、批量操作、多用limit等。还提及索引优化、字段类型选择、group by效率提升等方面,同时指出MySQL反向查询的索引使用问题。 1.不要使用select*,要使用 select 指定列jvzquC41dnuh0lxfp0tfv8z235<37<581cxuklqg1fkucrqu13976;746:
6.SQL优化还不会?速来掌握这15个小技巧本文详细介绍了15种优化SQL语句的方法,包括避免使用`select*`、用`unionall`代替`union`、小表驱动大表、批量操作、合理使用`limit`、优化`in`和`exists`、控制索引数量、字段类型选择、提升`groupby`效率以及索引优化。这些技巧有助于提高数据库查询性能,解决线上接口性能问题。 jvzquC41dnuh0lxfp0tfv8hz{ztcv4ctvodnn4fgvgjn|4358<33B:5
7.SQL性能优化的47个小技巧,果断收藏!腾讯云开发者社区了解了MySQL的执行过程,我们才知道如何进行sql优化。 客户端发送一条查询语句到服务器; 服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中的数据; 未命中缓存后,MySQL通过关键字将SQL语句进行解析,并生成一颗对应的解析树,MySQL解析器将使用MySQL语法进行验证和解析。例如,验证是否使用了错误的关键字,或者关键jvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk04<6;3;:
8.SQL优化核心思想第8章讲解各种优化技巧,其中涵盖分页语句优化思想、分析函数减少表扫描次数、超大表与超大表关联优化方法、dblink优化思路,以及大表的rowid切片优化技巧。掌握这些调优技巧往往能够事半功倍。 第9章分享在SQL优化实战中遇到的经典案例,读者可以在欣赏SQL优化案例的同时学习罗老师多年专职SQL优化的经验,同时学到很多具有实战jvzquC41yy}/gyzdkv4dqv4dqqqEg}fknuEjfFS389;8
9.30种SQL语句优化的方法汇总Mysql30种SQL语句优化的方法汇总 这篇文章从30个方面,分享了sql优化的一些小技巧,希望对你有所帮助,需要的朋友可以参考下 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用! 【如果你想靠AI翻身,你先需要一个靠谱的工具!】 1)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立jvzquC41yy}/lk:30pku1jwvkerf1;;67;;/j}r
10.MySQL数据库优化的八种方式(经典必看)腾讯云开发者社区事务的另一个重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰。 5、锁定表 尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。由于在事务jvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk049>2:6?
11.常见的SQL优化面试专题大全数据库其它总结 到此这篇关于常见的SQL优化面试专题的文章就介绍到这了,更多相关SQL优化面试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 您可能感兴趣的文章: MYSQL 优化常用方法 MYSQL性能优化分享(分库分表) MySQL 索引分析和优化 面试中常常被问到sql优化的几种方案微信jvzquC41yy}/lk:30pku1jwvkerf1;<8;9>/j}r
12.SQL语句优化方法30例(推荐)MsSql在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法,提供效率。 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用! 【如果你想靠AI翻身,你先需要一个靠谱的工具!】 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最 jvzquC41yy}/lk:30pku1jwvkerf1;99:94ivv
13.Hive/HiveSQL常用优化方法全面总结腾讯云开发者社区join优化是一个复杂的话题,下面先说5点最基本的注意事项。 build table(小表)前置 在最常见的hash join方法中,一般总有一张相对小的表和一张相对大的表,小表叫build table,大表叫probe table。如下图所示。 图来自http://hbasefly.com/2017/03/19/sparksql-basic-join/ jvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk03=:568:
14.浅谈MySQL中优化sql语句查询常用的30种方法SpringMVCMaven浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用jvzquC41yy}/ewgnqiy/exr1o{hbvrx1r1?37<=830nuou
15.Oracle数据库管理与优化且所有的归档日志都有,现控制文件全部损坏,其他文件全部完好,请问该怎么恢复该数据库,说一两种方法。 14,用rman写一个备份语句:备份表空间TSB,level 为2的增量备份。 15,有个表a(x number(20),y number(20))用最快速高效的SQL向该表插入从1开始的连续的1000万记录。 jvzquC41dnuh0lxfp0tfv8UkpgGqruj21cxuklqg1fkucrqu15?29;:6
16.sql优化常用的几种方法(持续更新中)sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,总结一些方法如下: 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: jvzquC41dnuh0lxfp0tfv8|jns{o|qz1ctzjeuj1fgzbkux132>69<;82