zoukankan      html  css  js  c++  java
  • 一个简单的SQL最优写法讨论(1)

    最近在处理SQL的优化工作,拿一些碰到的例子大家一起讨论一下,希望有更多的人参与,请在发表时说明是什么数据库:

    第一个语句:

    SELECT A,B,C FROM T1 WHERE C>5

    有没有更好的写法?

    补充一下前提条件:

    1.海量数据存在这个表中;

    2.表中的C列值有很多,但是有重复;

    A  B  C

    A1  XE  9

    AY  BV  7

    QM  UH  5

    AS  UU  8

    AA  PO  6

    JI    A0  4

    ER  6     9

    U8  G5   6

    AM  EW  2

    ...

    WE  XX  67867433134

    我想再等一下的,但是,没有人告诉我有什么优化的地方,我就说说我的理解和想法,各位看官请评一下,如有不对的请指教!

    第一点:数据量大,多值

      建立索引是必需的;

    第二点:找值的理解

      有了索引后,那索引可能已是以下的排序方式,我们看看会不会有可能是这样:

    表: A  B  C

      A1  XE  5

      AY  BV  5

      QM  UH  6

      AS  UU  4

    索引:

      C  地址

      4  OXD001

      5  OXD002

      5  OXD003

      6  OXD004

    OK,SELECT A,B,C FROM T1 WHERE C>5 看看是否会这样

    OXD002 的5和这里的条件5比较

    OXD003 的5和这里的条件5比较

    OXD004 的6和这里的条件5比较

    结果是找到有用的6.

    以上的条件放大,4有1亿行;5有3亿行;6有500万行,2有1000万行,那扫描的行数是不是会可能是3亿行+500万行?

    看出点子来了吧?

    我们可以改这条语句了,看看这样写:

      SELECT A,B,C FROM T1 WHERE C>=6

    那你又怎么理解在索引中的扫描查找过程?

    OXD004 的6和这里的条件6比较

    结果是找到有用的6.

    我的结论:

    因为我们不知道数据库引擎会怎么理解这两个语句,应该是不同的版本不同厂商有可能不同.但是,C>5有可能要扫描5有可能不用,C>=6是绝对不用扫描5(在不同的版本中是有可能的).这样,上边的扫描行数可能从这个条件中看出可能存在的差异,扫描3亿500万行还是500万行,也就可能存在10分钟与5小时或更多的差异.

    请发表你的看法!


    本文原创,转载请注明出处.

  • 相关阅读:
    Nodejs学习(四)- express目录的分析
    为什么越来越多人选择小而美的公司?
    想要惊艳面试官?你一张嘴就输了
    别装了,你根本就不想变成更好的人
    大学生工资160元,不合情是否合理?
    你还能陪父母多久?
    为什么越来越多人选择小而美的公司?
    考上研后的生活居然是这样的…
    以钻石为灵感的 LOGO 设计作品
    关于JavaScript数组,你所不知道的3件事
  • 原文地址:https://www.cnblogs.com/yiyumeng/p/1824763.html
Copyright © 2011-2022 走看看