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代替