印象中,不久之前,好似讲过要稳篇数据库代码嘅优化建议文章黎share俾大家,但,忙到根本忘记咗呢件事哈哈~

今日岩好见到一篇都几好~于是乎,就稍微整理下,share俾大家

mysql索引注意事项 mysql 索引建议_字段

(1)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引下,数据在物理上随机存放在数据页上。合理的索引设计要建立在对各种查询的分析和预测上。一般来说:

a.有大量重复值、且经常有范围查询( > ,< ,> =,< =)和 order by、group by 发生的列,可考虑建立集群索引;

b.经常同时存取多列,且每列都含有重复值可考虑建立组合索引, 选择度高的列建议作为索引的第一个字段

c.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。索引虽有助于提高性能但 不是索引越多越好,恰好相反过多的索引会导致系统低效。用户在表中每加进一个索引,维护索引集合就 要做相应的更新工作。


(2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,



Sql 代码 : select id from t where num is null;



可以在 num 上设置默认值 0,确保表中 num 列没有 null 值,然后这样查询:

Sql 代码 : select id from t where num=0;

(3)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。


(4)应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,



Sql 代码 : select id from t where num=10 or num=20;



可以这样查询:



Sql 代码 : select id from t where num=10 union all select id from t where num=20;




(5)in 和 not in 也要慎用,否则会导致全表扫描,如:



Sql 代码 : select id from t where num in(1,2,3);



对于连续的数值,能用 between 就不要用 in 了:



Sql 代码 : select id from t where num between 1 and 3;




(6)下面的查询也将导致全表扫描:



Sql 代码 : select id from t where name like '%c%';



若要提高效率,可以考虑全文检索。


(7)如果在 where 子句中使用参数,也会导致全表扫描。因为 SQL 只有在运行时才会解析局部变量,但优 化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计 划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:



Sql 代码 : select id from t where num=@num ;



可以改为强制查询使用索引:



Sql 代码 : select id from t with(index(索引名)) where num=@num ;




(8)应尽量避免在 where 子句中对字段进行表达式操作, 这将导致引擎放弃使用索引而进行全表扫描。



Sql 代码 : select id from t where num/2=100;



可以这样查询:



Sql 代码 : select id from t where num=100*2;




(9)应尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:



Sql 代码 : select id from t where substring(name,1,3)='abc';#name 以 abc 开头的 id



应改为:



Sql 代码 : select id from t where name like 'abc%';




(10)不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用 索引。


(11)在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件 时才能保证系统使用该索引, 否则该索引将不会 被使用, 并且应尽可能的让字段顺序与索引顺序相一致。


(12)不要写一些没有意义的查询,如需要生成一个空表结构:



Sql 代码 : select col1,col2 into #t from t where 1=0;



这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:

Sql 代码 : create table #t(…);

今日就post住12条先啦,下次再继续!goodnight!