zoukankan      html  css  js  c++  java
  • 常见数据库优化方案(八)

    常见数据库优化方案(索引)

    索引好比书的目录,好比新华字典的拼音、偏旁部首查字,可以帮助人快速查找到需要的内容,
    当数据表记录达到几十w级别的时候,索引的作用非常明显。所以建立索引也是需要消耗资源的。

    索引类型有多种,哈希、BTREE、全文索引等,其实不管什么类型,都是为了在特定业务场景下方便快速查找数据的算法。所以建立索引以最常用查询信息作为建立索引的依据为最佳选择。

    手动创建索引

    CREATE INDEX index_tb_student_name ON tbl_student(stu_name)

    使用索引(在where 之后加上索引,提高传效率)

    select * from tbl_student where stu_name=? 索引作为WHERE查询条件

    原理: 
    当以某个字段建立一个索引的时候,数据库就会生成一个索引页,当我们查询数据时,Oracle会先查索引页,这样就能够很快的查找到要找的记录。

    注意: 
    如果表的列很少,不适合建索引。 
    当执行过多次的insert,delete,update后,会出现索引碎片,影响查询速度,我们应该对索引进行重组,其方法如下: 
    drop index index_name; 
    create index index_name on table(column) 
    其实,就是删除掉索引,重新再建立索引。

    拓展: 
    对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会使用。

    对于使用like的查询,查询如果是 “%aaa” 不会使用到索引,‘aaa%’会使用到索引。

    下列的表将不会使用索引: 
    1、如果条件中有or,即使其中有条件带索引也不会使用。 
    2、对于多列索引,不是使用的第一部分,则不会使用索引。 
    3、like查询是以%开头 
    4、如果列类型是字符串,那一定要再条件中将数据使用引号引起来,否则不使用索引。(添加是,字符串必须“) 
    5、如果MySQL估计使用全表扫描比使用索引快,则不使用索引。

    alter table account add index my_index(login,name) 

    //login就是最左边的列,name就是右边的列

    如果表中有复合索引,索引作用在多列上,此时我们注意:对于创建的多列索引,只要查询条件使用了最左边的列,索引一般会被使用。

    此时:

    select * from account where name="timchen"

    由于使用的是右侧的列,此时索引是不会生效的,如何知道呢? 
    添加explain 此时possible_key的值是为空的。

    但是当我们使用左侧的列是,explain的值不为空。

     索引方法

     常见的索引方法有BTREE以及HASH这两种方法各有优劣

    HASH方法:

    这种方法是将想要设置索引的一列整体使用HASH算法进行计算,并得到HASH值排序在HASH数组上,所以HASH索引可以实现一次定位(效率很高)

    缺点:

    1、由于是经过HASH值进行比较,所以只能进行等式比较,不可以进行范围查询

    2、每一次都要进行全表扫描

    3、由于哈希值是按照顺序排列的,但是哈希值映射的真正数据在哈希表中就不一定按照顺序排列,所以无法利用Hash索引来加速任何排序操作

    3、不能用部分索引键来搜索,因为组合索引在计算哈希值的时候是一起计算的。

    4、当哈希值大量重复且数据量非常大时,其检索效率并没有Btree索引高的。

    BTREE方法:

    BTREE方法以B+树为存储结构实现的。在InnoDB引擎中和MyIsAm引擎中有很大区别(MyISAM引擎中索引文件和数据文件在存储中时分开的|非聚集,而InnoDB引擎则是聚集索引)

    Btree索引中的最左匹配原则:

    Btree是按照从左到右的顺序来建立搜索树的。比如索引是(name,age,sex),会先检查name字段,如果name字段相同再去检查后两个字段。

    所以当传进来的是后两个字段的数据(age,sex),因为建立搜索树的时候是按照第一个字段建立的,所以必须根据name字段才能知道下一个字段去哪里查询。

    所以传进来的是(name,sex)时,首先会根据name指定搜索方向,但是第二个字段缺失,所以将name字段正确的都找到后,然后才会去匹配sex的数据。

    建立索引的规则:

    1、利用最左前缀:Mysql会一直向右查找直到遇到范围操作(>,<,like、between)就停止匹配。比如a=1 and b=2 and c>3 and d=6;此时如果建立了(a,b,c,d)索引,那么后面的d索引是完全没有用到,当换成了(a,b,d,c)就可以用到。

    2、不能过度索引:在修改表内容的时候,索引必须更新或者重构,所以索引过多时,会消耗更多的时间。

    3、尽量扩展索引而不要新建索引

    4、最适合的索引的列是出现在where子句中的列或连接子句中指定的列。

    5、不同值较少的列不必要建立索引(性别)。

     

    索引类型:

     PRIMARY 主键。 就是 唯一 且 不能为空。

    INDEX 索引,普通的
    UNIQUE 唯一索引。 不允许有重复。
    FULLTEXT 是全文索引,用于在一篇文章中,检索文本信息的。

    相关资料:MYSQL中的普通索引,主健,唯一,全文索引区别

     

    痛苦预示着超脱
  • 相关阅读:
    2019 SDN上机第7次作业
    2019 SDN上机第六次作业
    2019 SDN上机第5次作业
    SDN课程阅读作业(2)
    2019 SDN上机第4次作业
    2019 SDN阅读作业
    2019 SDN上机第3次作业
    第09组 团队Git现场编程实战
    预习非数值数据的编码方式
    预习原码补码
  • 原文地址:https://www.cnblogs.com/supperlhg/p/8745368.html
Copyright © 2011-2022 走看看