数据库索引
2016-06-05 12:05:10 30 举报
AI智能生成
mysql数据库索引的理论知识
作者其他创作
大纲/内容
索引分类
聚集索引
有主键:主键为聚集索引
无主键:第一个不允许NULL的唯一索引
无主,无非NULL唯一索引:使用innodb内置rowid
非聚集索引(二级索引,辅助索引)
ICP
ICP的使用条件
只能用于二级索引
只能用于单表的索引作为filter条件下推,不适用多表连接的连接条件下推
索引操作类型是EQ_REF/REF_OR_NULL/REF/SYSTEM/CONST才可以使用ICP
只能是Range操作,ALL/FT/INDEX_MERGE/INDEX_SCAN 不行
mysql特殊索引:前缀索引
1.索引的列有varchar字段 2.只索引了其开头部分长度的值
优点:节省索引空间。缺点:不支持ORDER BY 和GROUP BY
索引结构
B+树结构
聚集索引的叶子节点存放数据
非聚集索引存放的:非聚集索引的key+主键值
问:那么,根据二级索引查询的时候,是先查到叶子节点,然后再根据主键值查一次么?
强烈建议表都要有主键且以数字型为主键
B+树的高度是索引高度
聚集索引高度
决定根据主键取数据的理论io次数
非聚集索引高度
非聚集索引读取数据的理论io次数:本身+加上根据聚集索引的io次数
实际上由于缓存,可能不需那么多io
总结
索引的高度控制在3以内(含3)最合适,所以单表的记录数不要特别大
索引列的总长度越长,索引的高度可能越大。SQL的性能就越差
索引使用成本
空间成本
索引占空间,尤其大表不能忽略
时间成本
用不好反而浪费时间
区分两个概念
扫描行数
返回行数
更新成本
若增删改的内容和索引相关,在更新记录的同时还需要更新记录相关的二级索引,这可能会增加很多额外的IO
问题
问:那么,根据二级索引查询的时候,是先查到叶子节点,然后再根据主键值查一次么?
mysql的一个block是做什么的?
0 条评论
下一页