美文网首页PHP程序员
Mysql索引哪些事

Mysql索引哪些事

作者: Gundy_ | 来源:发表于2016-12-22 10:11 被阅读48次

    索引有什么用

    • 为从数据库读取数据加速
    • 强制约束 (唯一索引 UNIQUE, 外键 FOREIGN KEY)
    • 没有任何索引的情况下查询页能正常运行
    • 但是那可能需要执行很长的时间

    你可能听说过的索引类型

    • BTREE索引 – mysql中主要的索引类型
    • RTREE索引 – 只有MyISAM支持, 用于GIS
    • HASH 索引 – MEMORY, NDB 支持
    • BITMAP 索引 – MySQL 不支持
    • FULLTEXT 索引 – MyISAM, Innodb(MySQL 5.6以上支持)

    MyISAM、Innodb索引对比

    • MyISAM

      数据指针指向数据文件中的物理位置
      所有索引都是一样的(指向物理位置))

    • Innodb
      主键索引 (显式或隐式) - 直接将数据存储于索引的叶子节点,而不是指针
      二级索引 – 保存主键索引的值作为数据指针

    BTREE索引能用于什么操作 ?

    查询所有 KEY=5 的记录 (点查询)
    查询所有 KEY>5 的记录 (开合间)
    查询所有 5<KEY<10 的记录 (闭合间)
    不适用于:查询KEY最后一个数字等于0的所有记录
    因为这不能定义为范围查询操作

    字符索引

    这(和数值)没什么区别… 真的
    collation是为字符串定义的排序规则
    如: “AAAA” < “AAAB”
    前缀LIKE 查询是一种特殊的范围查询
    LIKE “ABC%” 的意思是:
    “ABC[最小值]”<KEY<“ABC[最大值]”
    LIKE “%ABC” 无法使用索引查询

    联合索引

    是这样进行排序的, 比较首列,然后第二列,第三列以此类推,如:
    KEY(col1,col2,col3)
    (1,2,3) < (1,3,1)
    使用一个BTREE索引,而不是每个层级一个单独的BTREE索引

    索引的开销

    索引是昂贵的,不要添加多余的索引
    多数情况下,扩展索引比添加一个新的索引要好
    写 - 更新索引常常是数据库写操作的主要开销
    读 - 需要再硬盘和内存开销空间; 查询优化中需要额外的开销

    索引成本的影响

    • 长主键索引(Innodb) – 使所有相应的二级索引 变得更长、更慢
    • “随机”主键索引(Innodb) – 插入导致大量的页面分割
    • 越长的索引通常越慢
    • Index with insertion in random order – SHA1(‘password’)
    • 低区分度的索引是低劣的 – 在性别字段建的索引
    • 相关索引是不太昂贵的– insert_time与自增id是相关的

    Innodb表的索引

    • 数据按主键聚集
    • 选择最佳的字段作为主键
    • 比如评论表 – (POST_ID,COMMENT_ID) 是作为主键的不错选择,使得单个post的评论聚在一起
    • 或者 “打包” 单个 BIGINT(字段)
    • 主键隐式地附加到所有索引中
    • KEY (A) 实质上是 KEY (A,ID)
    • 覆盖索引,有利于排序

    MySQL是如何使用索引的

    查询
    排序
    避免读取数据(只读取索引)
    其他专门的优化

    MySQL优化器的第一法则

    在复合索引中,MySQL在遇到返回查询(<,>,BETWEEN)时,将停止中止剩余部分(索引)的使用;但是使用IN(…)的"范围查询"则可以继续往右使用索引(的更多部分)

    MySQL使用索引排序的规则

    • 不能对两个字段进行不同顺序的排序
    • 对非ORDER BY部分的字段只能使用点查询(=)– 在这种情形下,IN()也不行

    相关文章

      网友评论

        本文标题:Mysql索引哪些事

        本文链接:https://www.haomeiwen.com/subject/rsvcvttx.html