SQL优化以及索引

Posted 梅川酷子灬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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代替

 

  


 

以上是关于SQL优化以及索引的主要内容,如果未能解决你的问题,请参考以下文章

索引视图SQL优化以及数据库存储过程

SQL优化(二)

SQL Server 海量数据查询代码优化以及建议

Sql Server 优化----SQL语句的执行方式与锁以及阻塞的关系

Sql Server 优化----SQL语句的执行方式与锁以及阻塞的关系

一篇文章带你搞懂慢SQL以及优化的策略