1、考虑下面的情况,
mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| SCHOOL | varchar(64) | YES | | NULL | |
| NAME | varchar(64) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set
mysql> select * from student;
+--------+----------+------------+
| SCHOOL | NAME | birthday |
+--------+----------+------------+
| NUM_1 | Andy | 1985-08-20 |
| NUM_1 | Andy | 1989-08-20 |
| NUM_2 | Bill | 1983-08-20 |
| NUM_2 | Caroline | 1984-06-20 |
| NUM_3 | Bill | 1982-08-10 |
+--------+----------+------------+
5 rows in set
2、我要select * from student where school='NUM_2'; 这个查询必须要全表扫描(也就是遍历所有的记录),效率会很差。
3、对字段school建立索引,也就是把每条记录school字段的值取出来,进行排序,也就是索引。
4、索引的结构是B+Tree,是一种优化的二叉搜索树。节点包含多个元素值,每个元素值前后各有指针指向子节点,相邻两个元素值定义了子节点的上限和下限,叶子节点的指针指向数据库的记录,为了避免在树节点上下往返,会把枝节点的值拉到叶子节点,并且前一个叶子节点指向下一个叶子节点。
5、索引为什么可以提高访问效率?
存储引擎不需要遍历所有记录(全表扫描)来获取需要的记录,而是从索引的根节点出发,与元素值比较,找到合适的指针进入下层节点,两个元素值定义了下层节点的上限和下限,这样很快进入到叶子节点,最后定位到数据库中的记录。因为,索引结构是有序的,查找范围数据的效率也很高。