导读为什么要用索引1、索引是数据库中用于快速查找和操作数据的数据结构2、提高查询的效率3、可以优化表的排序和连接操作4、可以提高数据库的可扩展性。索引是帮助mysql高效获取数据的排好序的数据结构数据类型网址https://www.cs.usfca.edu/~galles/visualization/Algorithms.html索引数据结构详解hash对索引的key进行一次hash运算就能定位到要存储的位置仅能满足“”“IN”查询不支持范围查询存在hash冲突问题存储示例MyISAM存储引擎B-树所有节点都存有索引值和数据存储示例InnoDB存储引擎B树b-树的延伸数据只存储在叶子节点上所有非叶子节点只存储索引值存储示例如何用B树索引快速查找聚集索引与非聚集索引非聚集索引索引值和索引列数据不存在一起而是存储了索引列在磁盘中的内存地址MyISAM就是非聚集索引MyISAM存储引擎实现MyISAM索引文件和数据文件是分离的一个表会生成三个文件表结构文件(frm)索引文件myi和数据文件myd索引查询会先去myi文件中走索引查询定位到当前数据在myd文件中的存储地址最后再去myd文件中io到我们想要的数据聚集索引叶子节点包含了完整的数据记录InnoDB就是聚集索引InnoDB索引实现一个表会生成两个文件表结构文件(frm)和数据文件idb主键索引存储结构非索引存储结构存储的是主键id再次会表才能拿到整条数据为什么DBA自增主键做索引提高范围查询效率增加排序效率提高扫表能力,顺序访问。mysql 在底层又是以数据页为单位来存储数据的一个数据页大小默认为 16k也可以自定义大小也就是说如果一个数据页存满了mysql 就会去申请一个新的数据页来存储数据。如果主键为自增 id 的话mysql 在写满一个数据页的时候直接申请另一个新数据页接着写就可以了。如果主键是非自增 id为了确保索引有序mysql 就需要将每次插入的数据都放到合适的位置上。当往一个快满或已满的数据页中插入数据时新插入的数据会将数据页写满mysql 就需要申请新的数据页并且把上个数据页中的部分数据挪到新的数据页上。这就造成了页分裂这个大量移动数据的过程是会严重影响插入效率的。示例如果不按顺序插入10就会出现新的节点联合索引底层数据结构会先按照name进行排序再按照age进行排序最后按照位置进行排序mysql最左前缀优化原则最左前缀匹配原则在MySQL建立联合索引时会遵守最左前缀匹配原则即最左优先在检索数据时从联合索引的最左边开始匹配