zoukankan      html  css  js  c++  java
  • MySQL优化2.索引

    什么是索引:

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

    建立索引合适的列

      经常用作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代替

      

  • 相关阅读:
    走亲访友
    分而治之
    红色警报
    小字辈
    最长对称子串
    树的遍历
    acwing练习
    组合计数
    同余
    乘法逆元
  • 原文地址:https://www.cnblogs.com/danxun/p/12337168.html
Copyright © 2011-2022 走看看