A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 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子句中避免使用‘*’:
在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。



1 个回复

倒序浏览
棒棒的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马