0
点赞
收藏
分享

微信扫一扫

MySQL索引与事务的透析

1.查看索引

SQL执行语句:show index from 表名;


代码实例如下:


mysql> create table student(id int,name varchar(10));

Query OK, 0 rows affected (0.01 sec)

mysql> show index from student;

Empty set (0.00 sec)

可以发现在没有建立索引的情况下,表是没有索引的,那么这就涉及另一个问题了;


存在unique,primary key,foreign key 的时候,索引会自动生成;


代码实例如下:


mysql> create table student(id int primary key,name varchar(10));

Query OK, 0 rows affected (0.01 sec)

mysql> show index from student;

+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |

+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

| student |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |

+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

此时可以发现,存在索引了,列名字为id;


注意:如上述,索引会针对指定的列,在查询的过程中只有针对这一列进行查询,查询才会被索引进行优化;


当然还存在外键的时候,代码如下:


mysql> create table student(id int primary key,name varchar(10),classid int,foreign key(classid) references class(classid));

Query OK, 0 rows affected (0.01 sec)

mysql> show index from student;

+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |

+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

| student |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |

| student |          1 | classid  |            1 | classid     | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |

+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

这里的外键的建立,小编在上期讲解过,不明白的小伙伴就去看看吧~~~


注意:此时索引指定的列名就为两个,上面那个是主键建立的索引,下面是外键建立的索引;


2.创建索引

SQL执行语句:create index 索引名 on 表名(列名);


代码实例如下:


mysql> create index id_index on stu(id);

Query OK, 0 rows affected (0.01 sec)

Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from stu;

+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |

+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

| stu   |          1 | id_index |            1 | id          | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |

+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

注意:创建索引是一个危险的操作,在创建索引时,数据库会根据现有的数据,进行大规模的整理,如果数据过多,会导致服务器卡死;


3.删除索引

SQL执行语句:drop index 索引名 on 表名;


代码实例如下:


mysql> drop index id_index on stu;

Query OK, 0 rows affected (0.01 sec)

Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from stu;

Empty set (0.00 sec)

通过上述的stu表建立的索引进行删除后,可以发现在再次查找索引的时候就为空了;


注意:这里删除的是自己手动创建的索引,如果为(主键,外键,unique创建的索引)那么此时就不能够进行删除;


2.3索引原理理解

索引的内部原理其实是一种数据结构:即B+数(N叉搜索树)


那么我们之前学过的关于查询比较高效的就有哈希表,二叉搜索树;


📍哈希表是内部一种顺序表和链表结合的结构,在查找精确的数值时,他是可以实现的,但是在数据库的模糊匹配,范围数据查询,那么哈希表就不适用了;


📍二叉搜索树来说,当数据量过大时,那么此时树的高度就为log(N),那么此时还是完全平衡的状态,如果为单分支,那么树的高度就很离谱了;


那么此时就有一个B+树来解决这个问题;那么接下来,就先讲解B树的结构;


1.B树

B树就是和二叉搜索树基本原理一致,但是一个节点上不止一个数字,当多个数字在时,就会分为几个范围,小编就通过画图解释一下吧;


如图所示:




如上图所示,此时树的高度就大大减少了,那么就缩短了时间复杂度;


注意:


一个节点存储N个key那么就会生成N+1个区域,每个区域会生成对应的子树;


结点是存储在硬盘区域的,一次读硬盘,就取出来几个key,再进行比较;


一个节点中是可以存储N个key的,但是这不是无限制的,当一个节点的key过多时,就要触发节点的分裂;当然当节点的太少时,就会触发节点的合并;


2.B+树

对于B+树是B树的优化版本,那么还是和上述一样,小编来画图来解释吧;




如图所示:B+树就是省去了大于最大值的区间范围,并且每个区间的子树最大值必须为区间的最大值,即父节点对应区间最大值;



举报

相关推荐

0 条评论