黑马程序员技术交流社区

标题: 【石家庄校区】sql语句优化 [打印本页]

作者: 番茄爆炒西红柿    时间: 2017-11-29 09:59
标题: 【石家庄校区】sql语句优化
本帖最后由 小石姐姐 于 2017-11-29 15:00 编辑

对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
前提:表数据很多索引失效情况:
1:避免在索引列上使用计算。WHERE子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。
低效: SELECT … FROM EMPLOYEE WHERE SAL * 12 > 25000;
高效: SELECT … FROM EMPLOYEE WHERE SAL > 25000/12
2:避免在索引列上使用IS NULL和IS NOT NULL:
对于单列索引,如果列包含空值,索引中将不存在此
低效: (索引失效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;
高效:(索引有效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0
记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中。
3:应尽量避免在 where 子句中使用!=或<>操作符
        
否则将引擎放弃使用索引而进行全表扫描。
         MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,以及某些时候的LIKE。
         可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例如:
         SELECT id FROM  t WHERE col LIKE 'Mich%'; #  这个查询将使用索引,
         SELECT id FROM  t WHERE col  LIKE '%ike';   #这个查询不会使用索引。
4:应尽量避免在 where 子句中使用 or 来连接条件否则将导致引擎放弃使用索引而进行全表扫描,如:
       select id from t where num=10 or num=20
可以 使用UNION合并查询: select id from t where num=10 union all select id from t where num=20
5:in 和 not in 也要慎用,否则会导致全表扫描,
  如:
        select id from t where num in(1,2,3)对于连续的数值,能用 between 就不要用 in 了:
        Select id from t where num between 1 and 3
索引并不是越多越好,
       索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

SELECT子句中避免使用‘*’:
在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。




作者: 小石姐姐    时间: 2017-11-29 15:02
棒棒的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2