Mysql索引哪些事

###索引有什么用

  • 为从数据库读取数据加速
  • 强制约束 (唯一索引 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()也不行
周强 wechat
多谢打赏
坚持原创技术分享,您的支持将鼓励我继续创作!