索引工作原理
设置一个唯一字段(主键)为索引, 将根据该字段按照指定的数据类型建立额外的有序数据, 下一次检索数据时不再使用全表查询(线性查询), 使用二进制搜索目标并返回对应的存储地址, 实现优化查询
缺点 :
-
索引会使用额外空间, 定义不必要的索引会造成空间和性能损耗
-
定义索引到一个重复字段会使性能下降到全表查询, 建议使用主键作为索引字段
总结 : 索引就是一本书的目录, 检索内容只要检索目录并跳转就可以; 但是目录本身也会占用一定的页数;假如一本书是1000页, 使用了索引(目录)就是1010页(1000页内容+10页目录)
什么是索引基数(Cardinality)
高基数: 基本使用了主键/唯一字段作为索引字段
普通基数: 使用带有重复记录的字段作为索引字段
低基数: 使用带有很多重复记录的字段作为索引字段, 可能会被系统自动优化为不使用索引
索引的类型
普通索引 | 唯一索引 | 空间索引 | 全文索引 |
---|---|---|---|
NORMAL | UNIQUE | SPATIAL | FULLTEXT |
索引的意义 与优点
主键索引、唯一索引、一般索引、hash索引(memory存储引擎支持)、聚簇索引、空间索引、全文索引(MyISAM支持)
什么时候使用索引
在什么字段设置索引
-
作为查询条件的字段
-
经常进行排序,分组, 联合操作 的字段
索引方法
btree(b+树) | hash | |
---|---|---|
效率 | 低 | 高 |
模糊查询 | 支持 | 不支持 |
排序 | 支持 | 不支持 |
引擎支持 | MyISAM , inndb ,MEMORY | MEMORY(没有unique约束) (innodb只存在于内部, 不支持手动创建) |
场景 |
为什么使用b+树作为索引的数据结构?
https://www.php.cn/mysql-tutorials-436372.html
索引的优点
1)大大减少了服务器需要扫描的数据量
2)可以帮助服务器避免使用临时表和文件排序
3)可以将随机I/O变为顺序I/O
InnoDB支持聚簇索引,MyISAM不支持聚簇索引;
InnoDB的聚簇索引和主键索引是一样的;主键索引的页子结点中存储的都是索引值以及行记录;非聚簇索引页子结点里存储的都是记录的物理地址;
MyISAM主键索引和非主键索引叶子节点中存储的都是记录的物理地址;
网友评论