聚簇索引与非聚簇索引
聚簇索引:将数据存储与索引放在一块,索引结构的叶子节点保存了行数据;如InnoDB使用到的就是聚簇索引。
非聚簇索引:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置。简单理解:在聚簇索引上建立的索引就是非聚簇索引。
在innodb中,在聚簇索引上建立的都是辅助索引,即非聚簇索引也叫辅助索引。一张表中只能有一个聚簇索引。其余索引都是非聚簇索引。辅助索引叶子节点存储的是主键值,访问数据总是要先查到主键值,再通过主键值访问到数据。即辅助索引访问数据总是需要二次查找。
思考:辅助索引为什么不记录地址直接访问数据,而是记录id二次查找访问?
防止增删操作改变数据的地址。id是主键不会改变。
在Innodb中
聚簇索引默认是主键,如果表中没有定义主键,Innodb会选择一个唯一且非空的索引代替,如果没有这样的索引,就会隐式创建一个主键作为聚簇索引。如果有了聚簇索引又希望再建立新的聚簇索引,则需要删除之前的聚簇索引,添加想要的聚簇索引。最后恢复即可。
MYISAM
MYISAM使用的是非聚簇索引,主键索引B+树的节点存储了主键,辅助索引B+树存储了辅助键。表数据存储在独立的地方。这两颗B+数据的叶子节点都使用了一个表中数据真是存放的位置。这两棵树并没什么区别,数据也可以直接查到。无需二次访问查。
聚簇索引优点
1.数据是存储在索引的叶子节点中的,一页有很多数据,访问同一页的不同数据时,已经把页加载到了缓存器中,再次访问时就直接从内存中完成访问。不必从磁盘进行访问,减少了磁盘I/O。而聚簇索引每次都访问磁盘。
2.辅助索引只保存主键值,比起物理地址占用的内存要小,减少了辅助索引占用的存储空间大小。增删改也只需要维护聚簇索引就好了。
什么情况下不使用索引
1.查询语句中使用like关键字
如果匹配字符串第一个字符为%,索引就不会使用。反之则使用。
2.查询语句中使用多列索引(复合索引)
不满足最左前缀原则的不会使用。
3.查询语句中使用OR关键字
匹配条件都创建了索引则使用索引,反之则不使用索引。