文档章节

SQL优化

蔡佳娃
 蔡佳娃
发布于 2017/08/08 23:45
字数 1004
阅读 44
收藏 2
点赞 0
评论 0

查询的模糊匹配

    尽量避免在一个复杂查询里面使用 like '%param%', 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用。

    解决办法:

    a. 修改前台程序,把查询条件的文本输入,改为下拉列表,用户模糊输入时,直接在前台就帮忙定位到具体的参数,这样在调用后台程序时,这列就可以直接用=来查询了。

    b. 直接修改后台代码,根据输入条件,先查询出符合条件的记录,将记录保存到临时表中,然后在用临时表做复杂关联。

索引问题

    在做性能跟踪分析过程中,经常发现不少后台程序的性能问题是因为缺少合适的索引造成的,当然也有建立了索引但是使用不当导致索引失效的造成的。

    不要在存在索引的数据列上进行以下操作:

    a. 索引字段上进行计算

--避免:
select id from TB_ where num/2=100;
--推荐
select id from TB_ where num=100*2;

    b. 索引字段上使用not in, <>, !=

--避免
select * from TB_ where col not in (2, 3);
--推荐
select * from TB_ where col not exists (2, 3);

--避免
select * from TB_ where col!=2;
--推荐
select * from TB_ where col>2 or col<2;

    c. 索引字段上使用 is null, is not null

    表设计的时候,需要添加索引的字段上,尽量使用非空约束。

    d. 索引列上出现数据类型转换(隐式转换

--避免
select e.ename, e.job from emp e where e.empno='7369';
--推荐
select e.ename, e.job from emp e where e.empno=7369;

    e. 索引字段上使用函数

--避免
select EmpNo,LastName from Emp where YEAR(HireDate)=2005;
--推荐
select EmpNo,LastName from Emp where HireDate between '' and '';

复杂操作

    部分UPDATE、SELECT语句写的很复杂(经常嵌套多级子查询),可以考虑适当拆成几步,先生成一些临时数据表,再进行关联操作。 

连接条件or

    如果是这样一个查询:

SELECT * FROM TB WHERE A=1 AND B>2 AND C<3 AND D IN (4,5,6);

    并且在TB表上有这样一个索引:CREATE INDEX INX_TB_ABCD ON TB (A,B,C,D),那么这个查询可以用到这个索引。
    如果同样是这个索引,查询换成:

SELECT * FROM TB_ WHERE A=1 OR B>2 OR C<3 OR D IN (4,5,6);

    那么这个查询就用不到上面那个索引,因为结果集是几个条件的并集,最多只能在查找A=1的数据时用索引,其它几个条件都需要表扫描,那优化器就会选择直接走一遍表扫描,所以索引就失效了。
    那么像第二个查询这样的应该怎么建索引呢,答案就是四个列上各建一个索引,或者只在选择性最高的列上建索引,比如A=1的数据量很少,就在A上建,如果D是4,5,6的数据很少,就在D上建,这样优化器就会选择先走索引查找,再对找出的结果集进行筛选,扫描数就会大幅减少。当然还可以这样:

SELECT * FROM TB_ WHERE A=1 
union all
SELECT * FROM TB_ WHERE B>2
union all
SELECT * FROM TB_ WHERE C<3
union all
SELECT * FROM TB_ WHERE D IN (4,5,6);

    需要注意的是:

select * from TB_ where col=10 or col=20;

    两个条件都在col上,所以只要col上有索引,就不存在索引失效的问题。

其他

    a. 尽量避免大事务操作,提高系统并发能力。

    b. 尽量避免向客户端返回大数据量,如果数据量过大,应考虑需求是否合理。

    c. 任何地方都不要使用select *,使用具体的字段列表代替*,不返回用不到的字段。

    d. 尽可能使用varchar代替char,因为变长字段存储空间小,可以节省存储空间。

 

© 著作权归作者所有

共有 人打赏支持
蔡佳娃
粉丝 16
博文 54
码字总数 48865
作品 0
海淀
程序员

暂无相关文章

懒惰根本就不存在

简评:芝加哥大学心理学教授,懒惰根本就不存在。(本文表面讲行为心理学实则讲教育) 金句:以好奇而不是判断来回应一个人的无效行为,是非常有帮助的。 本文「我」代表原作者 E Price。 自...

极光推送 ⋅ 26分钟前 ⋅ 0

Excel提取单元格中最后一个“.”后面的数据

java.lang.String ----- String =TRIM((MID(SUBSTITUTE(B2,".",REPT(" ",99)),(LEN(B2)-LEN(SUBSTITUTE(B2,".","")))*99,99)))...

klog ⋅ 28分钟前 ⋅ 0

mac远程桌面

下载安装remote-desktop-mac Mac beta 客户端 mac通过远程桌面访问windows服务器。

亚林瓜子 ⋅ 32分钟前 ⋅ 0

firrtl

动手---sbt(2)之后,再回头看 chisel第一个实验,根据 https://github.com/freechipsproject/firrtl 发现firrtl没有执行sbt assembly命令,重新执行这个命令,结果成功。如下图: joe@joe-As...

whoisliang ⋅ 36分钟前 ⋅ 0

NIO

一、通道(Channel):用于源节点与目标节点的连接。在 Java NIO 中负责缓冲区中数据的传输。Channel 本身不存储数据,因此需要配合缓冲区进行传输。 二、通道的主要实现类 java.nio.channel...

stars永恒 ⋅ 36分钟前 ⋅ 0

Android悬浮窗的实现

0. 前言   现在很多应用都使用到悬浮窗,例如微信在视频的时候,点击Home键,视频小窗口仍然会在屏幕上显示。这个功能在很多情况下都非常有用。那么今天我们就来实现一下Android悬浮窗,以...

猴亮屏 ⋅ 37分钟前 ⋅ 0

日志采集中的关键技术分析

概述 日志从最初面向人类演变到现在的面向机器发生了巨大的变化。最初的日志主要的消费者是软件工程师,他们通过读取日志来排查问题,如今,大量机器日夜处理日志数据以生成可读性的报告以此...

tqyin ⋅ 38分钟前 ⋅ 0

使用Navicat将数据导出为text文本 然后再导入

将数据导出为text文本效率很高 1. 准备工作 1.1 准备表结构 1.2 目标库 执行生成表结构sql 2.将表数据导出为text文本 生成的text文本 3. 目标库 导入text 4.效果...

Lucky_Me ⋅ 44分钟前 ⋅ 0

IntelliJ IDEA 乱码解决方案 (项目代码、控制台等)

文章介绍了idea下,项目乱码、控制台乱码及运行tomcat控制台乱码的解决方案,文章链接:https://www.cnblogs.com/vhua/p/idea_1.html

Funcy1122 ⋅ 47分钟前 ⋅ 0

IDEA使用sonarLint

一、IDEA如何安装SonarLint插件 1.打开 Idea 2.点击【File】 3.点击【Settings】 4.点击【Plugins】 5.在搜索栏中输入“sonarlint”关键字 6.点击【Install】进行安装 7.重启Idea 二、IDEA如...

开源中国成都区源花 ⋅ 51分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部