查询SQL优化 JOIN从句

在查询中不要使用select * 获取列数据【返回更少的数据】
讲解:
1、检索不必要的列会带来额外的系统开销,该省则省,特别是LOB类型的列

优点:

1、减少数据在网络上传输开销

2、减少服务器数据处理开销

3、减少客户端内存占用

4、字段变更时提前发现问题,减少程序BUG

5、如果访问的所有字段刚好在一个索引里面,则可以使用纯索引访问提高性能。

缺点:增加编码工作量

由于会增加一些编码工作量,所以一般需求通过开发规范来要求程序员这么做,否则等项目上线后再整改工作量更大。

如果你的查询表中有大字段或内容较多的字段,如备注信息、文件内容等等,那在查询表时一定要注意这方面的问题,否则可能会带来严重的性能问题。如果表经常要查询并且请求大内容字段的概率很低,我们可以采用分表处理,将一个大表分拆成两个一对一的关系表,将不常用的大内容字段放在一张单独的表中。如一张存储上传文件的表:

T_FILE(ID,FILE_NAME,FILE_SIZE,FILE_TYPE,FILE_CONTENT)

我们可以分拆成两张一对一的关系表:

T_FILE(ID,FILE_NAME,FILE_SIZE,FILE_TYPE)

T_FILECONTENT(ID, FILE_CONTENT)

通过这种分拆,可以大大提少T_FILE表的单条记录及总大小,这样在查询T_FILE时性能会更好,当需要查询FILE_CONTENT字段内容时再访问T_FILECONTENT表。
在select字段中避免不必要的列,连接条件中避免不必要的表【返回更少的数据】
1、如一中的讲解
2、连接条件中包含不必要的表会强制数据库引擎检索和匹配不需要的数据,增加了查询执行时间
不要在子查询中使用count()求和执行存在性检查
1、不要使用

select column_list from table where 0 < (select count(*) from table2 where ...)

2、使用下面的语句代替

sleect column_list from table where exists (select column_list from table2 where ...)

讲解:
使用count()时,数据库不知道你是在做存在性检查,它会计算所有匹配的值,要么会执行全表扫描,要么会扫描最小的非聚集索引;
而使用exists时,数据库就知道你此时是在做存在性检查了,当它发现第一个匹配的值时,就会返回true,并停止查询。类似的,可以使用in或者any代替count()。
使用全文搜索搜索文本数据,取代like搜索
全文搜索始终优于like搜索:
1、全文搜索让你可以实现like不能完成的复杂搜索,如搜索一个单词或一个短语,搜索一个与另一个单词或短语相近的单词或短语,或者是搜索同义词;
2、实现全文搜索比实现like搜索更容易(特别是复杂的搜索);
使用union实现or操作
1、在查询中尽量不要使用or,使用union合并两个不同的查询结果集,这样查询性能会更好;
2、如果不是必须要不同的结果集,使用union all效果会更好,因为它不会对结果集排序。
为大对象使用延迟加载策略
1、在不同的表中存储大对象(如VARCHAR(MAX),Image,Text等),然后在主表中存储这些大对象的引用;
2、在查询中检索所有主表数据,如果需要载入大对象,按需从大对象表中检索大对象。
使用 join 优化子查询

参考JOIN从句

-- 复杂语句
select a.name, (select b.name from test_b b where a.name = b.name) b_name from test_a a;
-- join 优化
select a.name, b.name b_name from test_a a left join test_b b on a.name = b.name; 
other:
因为使用join,MySQL不需要在内存中创建临时表
优化group by 语句
默认情况,MySQL对所有的group by col1,col2进行排序。这与在查询中指定order by col1, col2类似。如果查询中包括group by但用户想要避免排序结果的消耗,则可以使用order by null禁止排序
有索引的字段尽量走有索引的字段
如果想要在含有or的查询语句中利用索引,则or之间的每个条件列都必须用到索引,如果没有索引,则应该考虑增加索引
关联查询多用where条件刷选
少用in,not in,多用exists,not exists,=
少用<>,用> <
能在代码里完成的业务逻辑就尽量不要放在SQL里

尽量让SQL中少出现case、when、then,这样会让逻辑更清楚,让SQL可读性更强

文件、图片等大文件用文件系统存储,不用数据库
不用多说,铁律!!!数据库只存储路径。

集中批量查询【减少数据库交互次数】

tips:新增、删除、修改操作可参考查询操作

猜你喜欢

转载自www.cnblogs.com/tufujie/p/9648088.html