mysql数据库的Innodb引擎所有的表都默认建立在索引之上的,也就是聚集索引,而主键就是聚集索引,所以主键只能建一个。普通索引也就是非聚集索引,可以多个。 索引的数据结构是B+树也就是平衡树。查找数据的时候根据索引查找数据所在位置然后取到数据。查找普通索引的时候是先根据普通索引找到主键再根据主键定位到数据,也就是数据是和主键一起存储的。

  我们知道计算机磁盘IO是非常高昂的操作,所以优化后的磁盘IO是有预加载的,也就是读到哪条数据把附近的数据也一块读了,就是page。而B+树的结构,随便找了个图看看。从索引定位数据,最理想的是第一读加载page时就把索引全拿到内存里了,直接定位到数据这样就非常快了。然后实际情况不可能如此,但是你也可以想到尽量加载多的索引数据也挺好的,这也是为什么数据都放到叶子节点,与索引比数据太大了。这是从索引到拿到数据的一个简单点的描述。那普通索引是怎么工作的呐?首先查找方式是一样的,只不过普通索引找到的叶子有索引字段和聚集索引,在通过聚集索引找到叶子数据。多了一个过程而已。

数据库唯一索引出重 唯一索引会回表吗_数据库唯一索引出重

数据库唯一索引出重 唯一索引会回表吗_数据库唯一索引出重_02

 

回表是什么?通常数据量大的时候回表是灾难性的,比如说人员表里有学号、姓名、年龄等字段,学号是主键,姓名上也建了普通索引,你如果查询查询name字段,通过name索引就拿到了,而如果在加个age呐?你要在根据主键定位数据拿到age字段数据,这个过程就是回表。这时候就要考虑联合索引了。索引使用原则什么的就不说了,简单写写记录下遇到具体问题顺着这个思路查查。