索引
1. 建立起一个在存储表阶段就有的一个存储结构能在查询的时候加速。
2. 提高读的速度,降低写的速度。
3. 读写比例为10:1
索引原理:
因软件时听过操作系统来进行对硬盘的读取工作(硬盘7200转,表示每分钟硬盘转7200圈)如果软件每次提取数据都只提取一点(像提取文件,每次只提取一行),那么系统和硬盘的负载会非常大(硬盘提取一般会花费0.095ms时间完成,这时间如果让CUP运行它会运行50000条CPU指令或10000条的python语句),所以操作系统会将后续的数据进行预读。所提取的大小称之为block块,一个块为4096字节,windows一般提取2个block块,mysql提取4个block块。
数据库的树形数据结构:
树形结构是指数据库在存储数据时,以特定关键值为中心进行向下扩散,以切割的方式将数据切割成最直接,最方便,耗费最小block块将数据进行提取。
1. 由根(root),分支(branch),叶子(leaf)构成
2. 根和叶子是必须有的
3. 只能有一个根和一层叶子,可以有多层分支。
4. 叶子为最外层结构
5. 树的高度是指数结构的层数。
数的层数决定了block块提取的速度,所以再基本树的情形下,发展出来b+树,尽量让层数控制在3层以内。
平衡树,B+树
1. 分支节点和根节点都不在存储实际的数据了,让分支和根节点能存储更多的索引信息,就降低了数的高度。
2. 在叶子节点之间加入了双向的链式结构,方便在查询中可以平向查找。
mysql当中所有b+树索引的高度都基本控制在3层,这样使得提取block块是大大节省了提取速度。让读取速度飞起来
聚集索引和辅助索引:
聚集索引:
1. 聚集索引只存放设置为主键的关键信息,因此每张表中只能由一个聚集索引,primery key 自动生成聚集索引,非空,唯一
2. 在innodb中,聚集索引和辅助索引并存,即设置主键的为聚集索引,而非主键的为辅助索引。
3. 聚集索引数据直接存储在树结构的叶子节点中。
4. 纪录的索引顺序与无力顺序相同因此更适合between and和order by操作
辅助索引:
1. 叶子节点除了包含键值以外,还包含了一个书签(bookmark),该书签告诉innoDB去哪个区域来进行数据的提取
2.myisam中只有辅助索引,没有聚集索引,所以它有3张表。
3. 每张表可以有多个非聚集索引,需要更多磁盘和内容多个索引会影响insert和update的速度
innoDB使用聚集索引和辅助索引:
辅助索引的存在并不影响数据在聚集索引中的组织,因此每张表上可以有多个辅助索引,但只能有一个聚集索引。当通过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助索引并通过叶子级别的指针获得只想主键索引的主键,然后再通过主键索引来找到一个完整的行记录。
索引的配置:
1. primary key主键,自动生成聚集索引
2. unique 自带辅助索引
3. index 手动配置辅助索引
添加:create index 索引名称一般用:ind_名字 on 表(字段);
删除:drop index 索引名 on 表名;
在不用索引时,最好删除掉相应的索引,因为设置多个无用索引后,会拖慢写入数据的速度。
索引设置和未设置对比: