大批量数据查询优化--建立索引

来源:互联网 发布:淘宝如何申请退款 编辑:程序博客网 时间:2024/05/21 00:19

查询操作在数据库的操作中所占的比重非常大,所以查询优化技术非常重要。

要不要建索引,首先要看你的数据量如何,如果数据量不大,就没有必要建立索引了,因为作用不大,还增加了索引的维护工作。

另外所谓根据select语句建立索引,就是对你经常查询的列来建立索引,如果你建立了一个索引,可是在你的select语句中很少用到这个索引,那就没有必要了。

具体方法是看你的select语句中的where子句条件是针对哪个字段的,就对这个字段建立索引。


    1. 合理使用索引:

           索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。

          在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引;

          在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引;

          如果待排序的列有多个,可以在这些列上建立复合索引(compound index);

         在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

       使用系统工具。数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。

       2.避免或简化排序 

       应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:

       索引中不包括一个或几个待排序的列;

       group by或order by子句中列的次序与索引的次序不一样;

      排序的列来自不同的表。

3.消除对大型表行数据的顺序存取

     在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数   据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。

还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作:

SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008

虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:

SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008

这样就能利用索引路径处理查询。

4.避免相关子查询

一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。

5.避免困难的正规表达式

MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”

即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。

另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3]>“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。

6.使用临时表加速查询

把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。
SqlServer数据库建立索引的语法:

  1. 按照索引的结构,可以将其划分为两大类:聚簇索引(Clustered index)和非聚簇索引(Noclustered index)。
  2. 按照表中建立索引的那一列(或列组合)中的数据是否各不相同,可以将索引分为唯一索引和非唯一索引。
  3. 建立索引的条件如下:
    (1)只有表的拥有者才能建立索引
    (2)每个表只能建立一个聚簇索引
    (3)每个表最多可以建立249个非聚簇索引
    (4)索引键值最大为900字节
    (5)索引最多可以包含16列
    (6)建立唯一性索引时,应保证建立索引的列不包括重复的数据,并且没有两个以上的NULL
    (7)建立聚簇索引时,应考虑数据库的剩余空间。剩余空间应为原表的120%
    (8)text、ntext、image列不能建立索引
  4. 建立索引
    CREATE [UNIQUE][CLUSTERED|NOCLUSTERED]
    INDEX index_name
    ON {table_name|view_name}
    (column_name [ASC|DESC][,...n])
  5. 查看索引信息
    sp_helpindex table_name
  6. 删除索引
    DROP INDEX tablename.indexname|viewname.indexname[,...n]

eg:

if exists(select name from sysindexes where name='ix_expertise_skillLever')

droup index [expertise表名].ix_expertise_skillLever

create noclustered index ix_expertise_skillLever on exertise(skillLever) with fillfictor=30

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在淘宝买到东西是坏的怎么办 冰箱冷冻室门生锈变形关不严怎么办 诲信电冰箱电脑板坏了怎么办 冰箱里放了热水后就不制冷了怎么办 双温冰柜冷藏矿泉水不冰怎么办 美的电饭煲e一传感器也没坏怎么办 美的电饭煲不工作显示C3怎么办 美的电饭煲啪一声响不工作了怎么办 误给宝宝吃了坏的饭怎么办 鼠标没反应键盘指示灯不亮怎么办 新买变频冰箱风机声音大怎么办 三星手机玩王者荣耀一直闪退怎么办 刚申请的阿里大宝卡不想要了怎么办 国美刚买不到一个月电视坏了怎么办 交保险后保险公司不给开收据怎么办 收据白联作废红联丢失怎么办 收据作废客户联给客户了怎么办 宜家买的床和床垫搬家了怎么办 科龙空调开机后自己关机怎么办 以旧换新旧的没给商家 报案怎么办 想换新手机但是旧的没坏怎么办 从苏宁易购买的电视坏了怎么办 苏宁易购服务站买的电视坏了怎么办 用微信登陆京东账号退不出来怎么办 微信账号密码手机号都忘记了怎么办 我的手机号京东被别人绑定了怎么办 京东之前绑定的手机号不用了怎么办 京东退货钱未到银行卡账号里怎么办 京东身份证绑的手机号不用了怎么办 海尔冰箱要退货箱子扔了怎么办 海尔冰箱门变形关不严没吸力怎么办 长时间不用的手机忘记密码怎么办啊 微信忘记密码手机号又不用了怎么办 华为账号换了手机密码忘记了怎么办 用u盘制作音响喊话内容怎么办 新三板公司退市了小股东怎么办? 新三板公司退市股东股票怎么办 利群收购乐天玛特超市卡怎么办 买房过户夫妻一方是外省户口怎么办 欠了国美金融贷款没钱还会怎么办? 国企员工涨工资不在编的员工怎么办