关于SQL IO的一些资料

摘要:
我对服务器的IO有点怀疑。经过思考,我做了一个实验,并模拟了相同的场景。通过优化SQL,我将查询的IO成本降低了7到8倍,页面响应大大提高。我对SQL IO没有太多研究。下面是一个列表。是时候为进一步研究收集数据了。花园里有很多关于SQLIO的介绍,非常好。说实话,有很多事情我无法理解,所以接下来我会写一些肤浅的东西。如何减少SQL带来的IO开销?

    前些天在做优化的时候发现一个有意思的现象,单纯的SQL执行很快,秒级返回,但是页面响应却很慢,一直在想这是为什么呢?有点怀疑服务器的IO有问题,想了想做了个实验,模拟了同样的场景,通过优化SQL将查询带来的IO开销降低了7到8倍的样子,页面响应果然得到了很大的提升。对于SQL的IO我没什么太多的研究,这里罗列一些东西,权当是为以后的深入研究做个资料的收集吧。园子里有很多关于SQL IO 的介绍,写的都很不错,说实话有很多看的我云里雾里的,故退而其次写一些皮毛的东西。这里只讲现象,不讲故事,场景也不一定完全的合理,具体的情况还得具体对待,不可对号入座哦。

       怎么才能降低SQL所带来的IO开销呢?仁者见仁智者见智,下面我列一些常见的查询方式:

  • 表连接与子查询

  关于SQL IO的一些资料第1张

  2个表结构如图,CustomerID做为关联键,左表记录100W左右,右表:5条,下面是我们比较常见的2个查询语句:  

查询A:
SET STATISTICS IO ON 
SELECT *,b.phone FROM dbo.Customers a LEFT JOIN  dbo.CustomerDetial b ON  a.CustomerID=b.CustomerID

对应的额IO
(1000002 行受影响)
表'CustomerDetial'。扫描计数1,逻辑读取3 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
表'Customers'。扫描计数1,逻辑读取6954 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。


查询B:
SET STATISTICS IO ON
SELECT*,(SELECT phone FROM dbo.CustomerDetial WHERE Customerid=a.CustomerID) phone FROM dbo.Customers a

对应的额IO
(1000002 行受影响)
表'CustomerDetial'。扫描计数1000002,逻辑读取3000006 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
表'Customers'。扫描计数1,逻辑读取6954 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

  从这个列子我们可以看到子查询付出的IO开销远远大于表连接,一般情况下能使用表连接则不要用子查询,当然这个不是一定的,还是要具体情况具体分析。

  • Exists、innerjoin、in

  这三者的使用也比较常见,建议的使用优先级inner join—> Exists—>in

  • OR 语句

  建议使用Union来替换

  • 有效使用索引

  有效使用索引可以降低索引扫描和表扫描带来的IO开销,特别要注意的是复合索引、覆盖索引的使用

  • 减少查询的列数、记录数

  今天先到这里,后续继续补充。同时欢迎看到该文章的朋友提供资料。

免责声明:文章转载自《关于SQL IO的一些资料》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java内存溢出详解Vue数据绑定下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SQL这样干,你就是给自己刨坑.....

SQL是作为一个程序员接触得非常多的一种语言,但是,很多时候,我们会发现,有些SQL的执行效率异常的差,造成了数据库的负担。我们通过分析这些有问题的SQL,就可以发现很多我们平时在写SQL的时候忽略的问题。 今天,我们就来讲一下这些需要改掉的坏习惯。 尽量少用负向条件查询 假设我们有一个Order表,表中有一个字段是Status,这个字段有4个值,分别是0...

初见Python<2>:列表和元组

  1、在python中,最基本的数据结构是序列,序列中每一个元素被分配一个序号,即元素的位置,称为索引。索引从0开始,-1表示倒数第一个元素,-2表示倒数第二个元素,因此既可以是从前到后开始对元素进行访问,也可以从后往前对元素进行访问。 2、python序列中有6种内建的序列:列表、元组、字符串、Unicode字符串、buffer对象,xrange对象。...

聚集索引与非聚集索引

聚集索引与非聚集索引的区别: 聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。 聚集索引的叶节点就是最终的数据节点,而非聚集索引的叶节仍然是索引节点,但它有一个指向最终数据的指针。 使用聚集索引来做查询操作时速度很快,但是做插入操作时就较为费时。 InnoDB支持聚集索引,MyISAM不支持聚集索引。InnoDB按照主键进行聚集,如果没有定义...

MySQL-快速入门(14)MySQL性能优化

1、MySQL性能优化包括查询速度优化、数据库结构优化、数据库服务器优化等。 优化的切入点:合理的结构设计、表结构、索引、查询语句。 2、show status查询数据库的性能参数 show status like 'value';value:Connections=>连接MySQL服务器的次数Uptime=>MySQL服务器的上线时间Slow...

用Nexus做Maven私服全攻略

Nexus简介 Nexus是Sonatype推出的强大Maven仓库管理器产品,要比以前TSS上介绍的Artifactory要好使用的多,也是一个拆箱即用的Java App,内嵌Jetty容器和Java Wrapper做Windows服务,安装简单到解压然后双击install即可。更详细的帮助手册请上官方网站查看,这里推荐一个翻译中的书籍——《Maven权...

TS基础

1、函数声明、定义、使用 函数声明:制定函数的参数和返回值类型 函数实现:函数具体的实现,参数可少于等于函数的定义。函数实现参数TS会根据函数的声明进行推断 函数调用:函数的调用参数必须要和函数的声明一致,不然会报错   2、索引签名 TS支持字符串和数字索引,可以同时使用两种类型的索引,但是数字索引的返回值必须是字符串索引返回值类型的子类型   3、...