公司数据库中一个表中的数据,查询的时候很慢,看了一下建立的索引。
顺便复习一下索引的概念。
索引分为大致三种:聚集索引,非聚集索引,唯一索引。分别说一下这几个的关系。
聚集索引: 只要你表中有主键,就有索引。而且这个索引还是聚集索引,唯一的。所以也是唯一索引。一个表只能有一个聚集索引,
因为数据行本身只能按照一种顺序排列。当表中有聚集索引的时候,数据行才按照索引排列顺序,没有索引时候,数据行按照堆积方式
存储。
使用聚集索引的地方:
(1)查询某一个范围内的值的时候, 经常对某一列的值进行排序。
比如对一个员工压牌的表来说,经常要查询一个月,或者几天之内的数据,就可以在logdate上建立聚集索引。
非聚集索引:就有完全独立于数据行的结构。
--------------------------------------------------------
索引的设计规则:
查询语句的where子句,这是优化器重要关注的地方。如果你在where子句中使用了column1这一列,那么你可以建立的索引:
(1)在column1这一列上建立单一索引
(2) 表中有多索引,但是column1是这些索引列中的第一位。尽量避免多索引中column1不是在
第一列,这样的索引不能优化服务器性能。
索引的巧妙运用:
(1)select * from test where id>1500
select * from test where id-500>1000
若字段跟常量比较,mssql 会自动引用该列上的索引,若用的是变量,mssql 不会自动引用改列上的索引,而是根据聚集索引进行扫描。
最好不要对字段进行操作,像id-500这种情况已经对字段进行了操作。
(2) 加上with(index='索引名')指定索引
当加上索引后,where 子句中不管是常量还是变量,mssql都根据指定的索引进行扫描。
(3) 尽量避免使用like语句
如果是使用 like “%baaa%” 这样的条件根本用不到索引。
(4) 用聚合索引比用一般的主键作order by 时速度快,特别时小数据量情况。
用聚集索引作为排序列要比非聚集索引速度快很多。如果10万以上的数据,二者的速度差别不是很明显。
什么情况下应该不应该建立索引或者少建索引
(1) 表记录少。因为索引的话,要对数据库往返2次,少量数据,mssql 直接把全部数据取出来,速度远远比索引快。
(2) 经常 insert ,update,delete 的表,在查询允许的情况下尽量少用索引。
(3)数据重复且分布平均的字段。
(4)经常和主字段查询,但是主字段使用索引比较多的表字段
表经常按收费序号、户标识编号、抄表日期、电费发生年月、操作标志来具体查询某一笔
收款的情况,如果将所有的字段都建在一个索引里那将会增加数据的修改、插入、删除时
间,从实际上分析一笔收款如果按收费序号索引就已经将记录减少到只有几条,如果再按
后面的几个字段索引查询将对性能不产生太大的影响。
(5)