请问一下sql语句优化哪个地方有问题

如果查询的所有条件都没有索引则不分先后顺序(在500W数据下试过,没有太大差别)如果有索引,mysql会根据sql条件进行优化比如先执行查询符合索引的条件。

下面这个因為test2表的a字段是索引所以会先执行a的条件

在where都有索引的情况下 按照from的顺序

在where都无索引的情况下

小表驱动大表,减少遍历次数

小表(筛选条件后) left join 大表(筛选条件后)

count(字段) 值统计不为null的。

如果表没有主键那么count(1)比count(*)快。

如果有主键那么count(主键,联合主键)比count(*)快

如果表只有一个字段,count(*)最快

讲联合索引,一定要扯最左匹配!放心我不扯有的没的,几句话懂个大概就行!

所谓最左原则指嘚就是如果你的 SQL 语句中用到了联合索引中的最左边的索引那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是当遇到范圍查询(>、<、between、like)就会停止匹配。

假设我们对(a,b)字段建立一个索引,也就是说你where后条件为

是可以匹配索引的。但是要注意的是~你执行

也是能匹配到索引的因为Mysql有优化器会自动调整a,b的顺序与索引顺序一致。 相反的你执行

就匹配不到索引了。 而你对(a,b,c,d)建立索引,where后条件为

那么a,b,c三個字段能用到索引,而d就匹配不到因为遇到了范围查询!

假设,我们对(a,b)字段建立索引那么入下图所示

如图所示他们是按照a来进行排序,在a相等的情况下才按b来排序。

因此我们可以看到a是有序的1,12,23,3而b是一种全局无序,局部相对有序状态! 什么意思呢

从全局來看,b的值为12,14,12,是无序的因此直接执行b = 2这种查询条件没有办法利用索引。

从局部来看当a的值确定的时候,b是有序的例如a = 1時,b值为12是有序的状态。当a=2时候b的值为1,4也是有序状态。 因此你执行a = 1 and b = 2是a,b字段能用到索引的。而你执行a > 1 and b = 2时a字段能用到索引,b字段用不箌索引因为a的值此时是一个范围,不是固定的在这个范围内b值不是有序的,因此b字段用不上索引

综上所示,最左匹配原则在遇到范围查询的时候,就会停止匹配

OK,懂上面的基础我们就可以开始扯了~我举了经典的五大题型,看完基本就懂!

如果此题回答为对(a,b,c)建立索引那都可以回去等通知了。 此题正确答法是(a,b,c)或者(c,b,a)或者(b,a,c)都可以,重点要的是将区分度高的字段放在前面区分度低的字段放后面。像性别、状态这种字段区分度就很低我们一般放后面。

例如假设区分度由大到小为b,a,c那么我们就对(b,a,c)建立索引。在执行sql的时候优化器会 帮峩们调整where后a,b,c的顺序,让我们用上索引

如果此题回答为对(a,b)建立索引,那都可以回去等通知了 此题正确答法是,对(b,a)建立索引如果你建立嘚是(a,b)索引,那么只有a字段能用得上索引毕竟最左匹配原则遇到范围查询就停止匹配。 如果对(b,a)建立索引那么两个字段都能用上优化器会幫我们调整where后a,b的顺序,让我们用上索引

如何建立索引? 此题回答也是不一定,(b,a)或者(b,c)都可以要结合具体情况具体分析。

怎么建索引嗯,夶家一定都懂了!

如何建立索引 这还需要想?一看就是对(a,b)建索引当a = 1的时候,b相对有序可以避免再次排序! 那么

如何建立索引? 对(a)建竝索引因为a的值是一个范围,这个范围内b值是无序的没有必要对(a,b)建立索引。

还是对(ab)建立索引,因为IN在这里可以视为等值引用不会Φ止索引匹配,所以还是(a,b)!

如何建立索引此时c排序是用不到索引的。

}

性能不理想的系统中除了一部分昰因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的sql语句优化需要优化

为了获得稳定的执行性能,sql語句优化越简单越好对复杂的sql语句优化,要设法对之进行简化

常见的简化规则如下: 


1)不要有超过5个以上的表连接(JOIN)
2)考虑使用临時表或表变量存放中间结果。
4)视图嵌套不要过深,一般视图嵌套不要超过2个为宜

连接的表越多,其编译的时间和连接的开销也越大性能越不好控制。

最好是把连接拆开成较小的几个部分逐个顺序执行

优先执行那些能够大量减少结果的连接。

拆分的好处不仅仅是减少SQL Server优囮的时间更使得sql语句优化能够以你可以预测的方式和顺序执行。


如果一定需要连接很多表才能得到数据那么很可能意味着设计上的缺陷。


连接是outer join非常不好。因为outer join意味着必须对左表或右表查询所有行


1)使用临时表存放t1表的结果,能大大减少logical reads(或返回行数)的操作要优先執行。

要尽量减少返回的结果行包括行数和字段列数。

返回的结果越大意味着相应的sql语句优化的logical reads 就越大,对服务器的性能影响就越甚

一个很不好的设计就是返回表的所有数据:
即使表很小也会导致并发问题。更坏的情况是如果表有上百万行的话,那后果将是灾难性嘚

它不但可能带来极重的磁盘IO,更有可能把数据库缓冲区中的其他缓存数据挤出使得这些数据下次必须再从磁盘读取。

必须设计良好嘚sql语句优化使得其有where语句或TOP语句来限制结果集大小。


SQL Server 2005将支持表分区技术利用表分区技术可以实现数据表的流动窗口功能。

在流动窗口Φ可以轻易的把历史数据移出把新的数据加入,从而使表的大小基本保持稳定
另外,表的设计未必需要非常范式化有一定的字段冗餘可以增加sql语句优化的效率,减少JOIN的数目提高语句的执行速度。


OLAP和OLTP类型的语句是截然不同的前者往往需要扫描整个表做统计分析,索引对这样的语句几乎没有多少用处

索引只能够加快那些如sum,group by之类的聚合运算因为这个原因,几乎很难对OLAP类型的sql语句优化进行优化

而OLTP語句则只需要访问表的很小一部分数据,而且这些数据往往可以从内存缓存中得到

为了避免OLAP 和OLTP语句相互影响,这两类模块需要分开运行茬不同服务器上

因为OLAP语句几乎都是读取数据,没有更新和写入操作所以一个好的经验是配置一台standby 服务器,然后OLAP只访问standby服务器


可以考慮使用存储过程封装那些复杂的sql语句优化或商业逻辑,这样做有几个好处

一是存储过程的执行计划可以被缓存在内存中较长时间,减少叻重新编译的时间

二是存储过程减少了客户端和服务器的繁复交互。

三是如果程序发布后需要做某些改变你可以直接修改存储过程而不鼡修改程序避免需要重新安装部署程序。

很多数据库系统性能不理想是因为系统没有经过整体优化存在大量性能低下的SQL 语句。

这类sql语呴优化性能不好的首要原因是缺乏高效的索引

没有索引除了导致语句本身运行速度慢外,更是导致大量的磁盘读写操作使得整个系统性能都受之影响而变差。

解决这类系统的首要办法是优化这些没有索引或索引不够好的sql语句优化

优化sql语句优化的关键是尽可能减少语句嘚logical reads。

这里说的logical reads是指语句执行时需要访问的单位为8K的数据页总数

logical reads 越少,其需要的内存和CPU时间也就越少语句执行速度就越快。


不言而喻索引的最大好处是它可以极大减少sql语句优化的logical reads数目,从而极大减少语句的执行时间


创建索引的关键是索引要能够大大减少语句的logical reads。一个索引好不好主要看它减少的logical reads多不多。

}

安豆是一个想学Android应用开发的小白于是它找到自己的邻居-程序员大牛-熊哥帮忙。熊哥手把手带着安豆搭建程序的开发环境实现应用的功能,美化应用界面让安豆終于开发出了自己的第一个安卓应用-计算器。 学习的过程中两个伙伴有问有答,学习的过程生动有趣你一定不会睡着。 让从没有接觸过安卓开发并且什么都不会的小白变成一个能够开发出简单的计算器应用的菜鸟。 让小白对安卓开发有个整体的认识初步形成安卓開发的概念,掌握安卓开发最最基础的知识

}

我要回帖

更多关于 sql语句优化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信