zoukankan      html  css  js  c++  java
  • sql-如何提高SQL查询的效率?

    如何提高SQL查询的效率?
    原创猴子聊人物 发布于2019-10-31 21:00:00 阅读数 11195  收藏
    展开

    【题目】

    我们公司的数据量非常大,需要的不仅仅是提取数据,要了解SQL方案优化的。一般在写SQL时需要注意哪些问题,可以提高查询的效率?

    【解题思路】

    数据量大的情况下,不同的SQL语句,消耗的时间相差很大。按下面方法可以提高查询的效果。


    1. select子句中尽量避免使用*

    select子句中,*是选择全部数据的意思。比如语句:“select * from 成绩表”,意思是选择成绩表中所有列的数据。

    在我们平时的练习中,往往没有那么多数据,所以很多同学会图方便使用*。而在处理公司事务时,动辄十万、百万,甚至上千万的数据,这个时候再用*,那么接下来的几分钟就只能看着电脑屏幕发呆了。


    所以,在我们平常的练习中,就要养成好的习惯,最后需要哪些列的数据,就提取哪些列的数据。尽量少用*来获取数据。


    另外,如果select * 用于多表联结,会造成更大的成本开销。


    2. where子句比较符号左侧避免函数

    尽量避免在where条件子句中,比较符号的左侧出现表达式、函数等操作。因为这会导致数据库引擎进行全表扫描,从而增加运行时间。


    举个例子,下图是10名学生的成绩表,老师突然发现因为参考答案出错,给所有人都少加了5分,现在需要查询:给每人加5分后,成绩依然在90分以上的同学的学号。

    按照题目的思路直接书写,“给每人加5分后,成绩90分以上”的条件很多人会这样写:

    where 成绩 + 5 > 90  (表达式在比较符号的左侧)

    优化方法:

    where 成绩 > 90 – 5(表达式在比较符号的右侧)

    所以,为了提高效率,where子句中遇到函数或加减乘除的运算,应当将其移到比较符号的右侧。

    3. 尽量避免使用in和not in

    in和not in也会导致数据库进行全表搜索,增加运行时间。


    比如,我想看看第8、9个人的学号和成绩,大多数同学会用这个语句:

    select 学号, 成绩 from 成绩表 where 学号 in (8, 9)

    这一类语句,优化方法如下:

    select 学号, 成绩 from 成绩表 where 学号 between 8 and 9

    4. 尽量避免使用or


    or同样会导致数据库进项全表搜索。在工作中,如果你只想用or从几十万语句中取几条出来,是非常划不来的,怎么办呢?下面的方法可替代or。

    从成绩表中选出成绩是是88分或89分学生的学号:

    select 学号 from 成绩表 where 成绩 = 88 or 成绩 = 89

    优化后:

    select 学号 from 成绩表 where 成绩 = 88

    union

    select 学号 from 成绩表 where 成绩 = 89


    语句虽然变长了一点,但处理大量数据时,可以省下很多时间,是非常值得的。


    5.使用limit子句限制返回的数据行数


    如果前台只需要显示15行数据,而你的查询结果集返回了1万行,那么这适合最好使用limt子句来限制查询返回的数据行数。


    【本题考点】

    在面试中,当面试官提出这一类问题,按照上述的方法进行回答都是没有问题的,但不仅在面试中,平时练习就养成习惯是最好的。


    大多数同学都会觉得“麻烦”、“不做也没有什么影响”,但是习惯总是慢慢养成的。


    拥有好习惯,未来在工作中,面对不同的数据量,就可以游刃有余地选择不同的方法来降低完成时间,从而提升工作效率。
    ————————————————
    版权声明:本文为CSDN博主「猴子聊人物」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/yangzhongblog/article/details/102849393

  • 相关阅读:
    Contiki学习笔记  第一个程序:Hello World
    contiki学习笔记---process结构体
    MYSQL碰到The total number of locks exceeds the lock table size 问题解决记录
    navicat连接mysql查询结果中文都是?号(C#)
    C#使用OracleBulkCopy
    解决IIS应用程序池默认回收导致程序崩溃
    构建可读性更高的 ASP.NET Core 路由机制
    .Net(C#)汉字和Unicode编码互相转换
    聊聊c#字符串拼接
    VS2010到VS2019各个版本的密钥
  • 原文地址:https://www.cnblogs.com/grj001/p/12223087.html
Copyright © 2011-2022 走看看