zoukankan      html  css  js  c++  java
  • MYSQL避免全表扫描

    MYSQL避免全表扫描

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引

    2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

    如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0

    3.应尽量避免在 where 子句中使用!=或操作符,否则引擎将放弃使用索引而进行全表扫描。

    4.应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,(可以使用union)

    5.in 和 not in 也要慎用,否则会导致全表扫描(能用 between 就不要用 in)

    6.下面的查询也将导致全表扫描。

    select id from t where name like '%李%',select id from t where name like '%李'

    若要提高效率,可以使用此格式select id from t where name like '李%',也可以考虑全文检索。

    7.避免在索引列上使用计算,也就是说,应尽量避免在 where 子句中对字段进行表达式操作和函数操作,这将导致引擎放弃使用索引而进行全表扫描。

    如:select id from t where num/2=100应改为:select id from t where num=100*2

    8.很多时候用 exists 代替 in 是一个好的选择:exists用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值true或false。

    select num from a where num in(select num from b)

    用下面的语句替换:select num from a where exists (select 1 from b where num=a.num)

    9.任何地方都不要使用 select from t ,用具体的字段列表代替“”,不要返回用不到的任何字段。

    10.用>=替代>

    高效: SELECT * FROM EMP WHERE DEPTNO >=4

    低效: SELECT * FROM EMP WHERE DEPTNO >3

    两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录,而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。

    11.用Where子句替换having子句

  • 相关阅读:
    VysorPro助手
    Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset
    Play 2D games on Nexus 6P running Android N7.1.1 with Daydream View VR headset
    Native SBS for Android
    ADB和Fastboot最新版的谷歌官方下载链接
    How do I install Daydream on my phone?
    Daydream Controller手柄数据的解析
    蓝牙BLE传输性能及延迟分析
    VR(虚拟现实)开发资源汇总
    Android(Java)控制GPIO的方法及耗时分析
  • 原文地址:https://www.cnblogs.com/richard713/p/15243327.html
Copyright © 2011-2022 走看看