zoukankan      html  css  js  c++  java
  • SQL优化以及索引

    什么是索引:

      索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

    建立索引合适的列

      经常用作where条件的列,order by排序的列

      数据列不重复而且并不是唯一的几个值

      不被经常修改的列

    普通查询

    SELECT * FROM emp WHERE empno=100002

    查询缓存

    SHOW GLOBAL VARIABLES LIKE '%query_cache%'

    表的引擎 innodb:第一次查询走数据文件,再次回走缓存

    SHOW VARIABLES LIKE '%storage_engine%'

    加入索引

    ALTER TABLE emp ADD INDEX(empno)
    SELECT * FROM emp WHERE empno=100002

    InnoDB:frm为表结构文件 ibd为索引+数据 文件

    是否使用了索引

    EXPLAIN SELECT * FROM emp WHERE empno=100002

    添加组合索引 (第一个索引列会使用索引,第二个索引列单独使用的时候不会使用索引)

    ALTER TABLE dept ADD INDEX my_ind (dname,loc)
    SELECT * FROM dept WHERE dname='AfZIrJvZNO'
    EXPLAIN SELECT * FROM dept WHERE dname='AfZIrJvZNO'
    EXPLAIN SELECT * FROM dept WHERE dname='AfZIrJvZNO' AND loc='IWHzzYwk'
    EXPLAIN SELECT * FROM dept WHERE loc='IWHzzYwk' AND dname='AfZIrJvZNO'

    模糊查询 如果like前加 % 不会使用索引

    EXPLAIN SELECT * FROM dapt WHERE dname LIKE '%AfZIrJvZNO%'

    使用or,or不会使用索引,

    EXPLAIN SELECT * FROM dept WHERE loc='IWHzzYwk' OR dname='AfZIrJvZNO'

    需保证列都有索引

    EXPLAIN SELECT * FROM dept WHERE deptno='10070' OR dname='AfZIrJvZNO'

    判断是否为null 应使用in
    explain select * from dept where dname=null

    EXPLAIN SELECT * FROM dept WHERE dname IN NULL

    group by 默认不是用索引

    EXPLAIN SELECT * FROM emp GROUP BY deptno
    EXPLAIN SELECT * FROM emp GROUP BY deptno ORDER BY NULL

    查询时尽量少用 >= <=等等

    EXPLAIN SELECT * FROM dept WHERE deptno<'10070'

    注意事项

      不要在列上进行运算

      不使用NOT IN操作

        NOT IN操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替

      

    
    
  • 相关阅读:
    C++的精度控制
    N*N矩阵的旋转 不开辟新空间
    关于内存对齐的探索
    最大公约数,最小公倍数
    冒泡排序,直接选择排序,插入排序实现
    vector function trmplate
    function template
    dijit/_WidgetBase
    DOJO之gridx
    [b0008] Windows 7 下 hadoop 2.6.4 eclipse 本地开发调试配置
  • 原文地址:https://www.cnblogs.com/whtt/p/12336912.html
Copyright © 2011-2022 走看看