对查询进行优化,应尽量避免全表扫描,首先应考虑在 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
索引并不是越多越好,
所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
SELECT子句中避免使用‘*’:
在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
前提:表数据很多
索引失效情况:
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
索引并不是越多越好,
所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
SELECT子句中避免使用‘*’:
在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。