• mysql 索引及查询优化总结


    背景:总结mysql索引相关的知识点.

    MySQL 索引及查询优化总结

    MySQL 索引及查询优化总结

    ps:其中的b+树有误。对or的使用有误。总体还是很详尽的

    注意:索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引。MyISAM和InnoDB存储引擎:只支持BTREE索引,也就是说默认使用BTREE,不能够更换。MEMORY/HEAP存储引擎:支持HASH和BTREE索引。

    1、索引我们分为四类来讲单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引、

    mysql索引类型:

    1. 主键索引 primary key 不允许null
    2. 唯一索引  union key  可以为null
    3. 普通索引 index
    4. 联合索引
    5. 全文索引

    建立索引的原则:

    1.  最左匹配原则 遇到范围查询(>、<、between、like)就停止匹配。 则mysql实际建的索引为:(a) (a,b) (a,b,c) (a,b,c,d)
    2. 尽量选择区分度高的列作为索引
    3. =和in可以乱序
    4. 索引列不能参与计算,保持列“干净”。 假如索引列参与计算的话,那每次检索时,都会先将索引计算一次,再做比较,显然成本太大。
    5. 尽量的扩展索引,不要新建索引

    补充:尽量扩展索引、不要新建索引 mysql目前主要索引有:FULLTEXT,HASH,BTREE 好的索引可以提高我们的查询效率,不好的索引不但不会起作用,反而给DB带来负担,基于BTREE结构,插入、修改都会重新调整索引结构,存储成本增加,写效率降低,同时DB系统也要消耗资源去维护。 基于刚才的最左匹配原则,尽量在原有基础上扩展索引,不要新增索引。 能用单索引,不用联合索引;能用窄索引,不用宽索引;能复用索引,不新建索引。 回到线上案例: nc_tms_order、ct_order看看分别有哪些索引

    索引的不足:空间,时间,开销

    常用优化总结:

    1. 有索引但未被用到的情况(不建议) (1) Like的参数以通配符%开头时 (2) where条件不符合最左前缀原则时 (3) 使用!= 或 <> 操作符时(使用>或<会比较高效。)(4) 索引列参与计算 (5) 对字段进行null值判断 (6) 使用or来连接条件(两端都有索引才行)

    2. 避免select *  在解析的过程中,会将'*' 依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。

    3. order by 语句优化  1)重写order by语句以使用索引;2)为所使用的列建立另外一个索引 3)避免在order by子句中使用表达式

    4. 提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉
    5. 使用 varchar/nvarchar 代替 char/nchar

    6. 在Join表的时候使用相当类型的例,并将其索引

    7. 优化嵌套查询:子查询可以被更有效率的连接(Join)替代;
    8. 很多时候用 exists 代替 in 是一个好的选择

    mysql索引的分类

     MySQL有哪些索引类型 ?

    MySQL索引背后的数据结构及算法原理(讲的很透彻)

    MySQL索引的分类(根据数据结构)(明白具体的分类)

    理解mysql搜索引的实现:

    MyISAM索引实现:

    MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

    MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

    在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。

    InnoDB索引实现:

    MyISAM索引和InnoDB索引的不同:

    第一个重大区别是InnoDB的数据文件本身就是索引文件。innodb 聚集索引data域存放的是数据的记录,mylsam的data域存储的是记录的地址

    从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

    这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

    第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。mylsam辅助索引data域存储的是地址。

    exists和in的区别?

  • 相关阅读:
    EasyHLS实现将IPCamera摄像机的RTSP流转成HLS(ts+m3u8)直播输出
    EasyHLS实现将IPCamera摄像机的RTSP流转成HLS(ts+m3u8)直播输出
    EasyHLS实现将IPCamera摄像机的RTSP转HLS直播输出
    基于EasyDarwin云视频平台的幼儿园视频直播(手机直播/微信直播)解决方案
    基于EasyDarwin云视频平台的幼儿园视频直播(手机直播/微信直播)解决方案
    EasyRTMP实现RTMP异步直播推送之环形缓冲区设计
    EasyRTMP实现RTMP异步直播推送之环形缓冲区设计
    EasyRTMP实现的rtmp推流的基本协议流程
    EasyRTMP实现的rtmp推流的基本协议流程
    EasyRTMP实现对接海康、大华等IPCamera SDK进行RTMP推送直播功能
  • 原文地址:https://www.cnblogs.com/lixuwu/p/10646565.html
Copyright © 2020-2023  润新知