- 将查询得到的辅助索引键值存放于一个缓存中 , 这时缓存中的数据是根据辅助索引键值排序的 。
- 将缓存中的键值根据RowID进行排序 。
- 根据RowID的排序顺序来访问实际的数据文件 。
之前的MySQL数据库版本不支持Index Condition Pusddown,当进行索引查询时,首先根据索引来查找记录 , 然后再根据where条件来过滤记录 。在支持index Condition Pushdown后,MySQL数据库会在取出索引的同时 , 判断是否可以进行where条件的过滤 , 也就是将where的部分过滤操作放在了存储引擎层 。在某些查询下 , 可以大大减少上层SQL层对记录的索?。╢etch),从而提高数据库的整体性能 , 优化支持range、ref、eq_ref、ref_or_null类型的查询,选择Index Condition Pushdown优化时,可在执行计划的列Extra看到Using index condition提示 。
注意事项
- 索引最用于一个范围列,如果查询条件中有两个或以上的范围列则无法全用到索引 。范围条件有:>、<、between、like等 。
- 建立索引的列不能包含null值 。
- 查询的时候,不要在索引列上做任何操作(如计算、函数、手动/自动类型转换等),会导致索引失效而转向全表扫描 。(MySQL认为这些操作会改变索引顺序)
- 使用auto_increment关键字的列必须有索引 。(只要有索引就行)
- 业务上具有唯一特性的字段 , 即使是多个字段的组合,也必须建成唯一索引 。
注意:聚簇索引决定了数据库的物理存储结构 , 而主键只是确定了表格逻辑组织方式 。这二者不可混为一谈 。
对于InnoDB存储引擎而言,主键毫无疑问是一个聚簇索引 。但是当一个表没有主键 , 或者没有一个索引,Innodb存储引擎会如何处理?有如下规则:
- 如果一个主键被定义了,那么这个主键就是作为聚簇索引,有且仅有一个 。
- 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚簇索引 。
- 如果没有主键也没有唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增 。
- 自增主键会把数据自动向后插入 , 避免了插入过程中的聚簇索引排序问题 。聚簇索引的排序 , 必然会带来大范围的数据的物理移动,这里面带来的磁盘IO性能损耗是非常大的 。而如果聚集索引上的值可以改动的话,那么也会触发物理磁盘上的移动,于是就可能出现page分裂,表碎片横生 。所以不应该修改聚簇索引 。
为什么MySQL不推荐使用uuid作为主键?
- 使用自增id的内部结构
(1)下一条流就会写入新的页中,一旦数据按照这种顺序的方式加载 , 主键页就会近乎于顺序的记录填满,提升了页面的最大填充率,不会有页的浪费 。
(2)新插入的行一定会在原有的最大数据行下一行 , MySQL定位和寻址很快,不会为计算新行的位置而作出额外的消耗 。
(3)减少了页分裂和碎片的产生 。
- 使用uuid的索引内部结构
这个过程需要做很多额外的操作,数据的毫无顺序会导致数据分布散乱,将会导致以下问题:
推荐阅读
- 基础&进阶 线段树学习笔记(一) | P3372 【模板】线段树 1 题解
- 下 MySQL数据库-数据表
- Mysql 数据库SQL脚本导入
- Docker MySql 查看版本的三种方法
- 一百一十九 salesforce零基础学习In-App Guidance实现引导页操作功能
- .NET源码学习 [算法2-数组与字符串的查找与匹配]
- 赞美父亲的作文结尾 赞美父亲的高中作文
- 关于对自己有信心的名言名语 对学习有信心的名言
- 关于父亲的高中作文800字 关于父亲的高中作文
- 高一化学全面学习方法整理