mysql 如何把整列数据*10_10张图告诉你,MySQL 是如何查找数据的?

在我们日常生活中经常会涉及到查找某个东西的场景,就比如说在一个学校里吧,我们想找出个子“最高的10个”同学,或者想查找姓名是“张三”的同学,又或者是查找学号是“666”的同学等等,在这些场景中,我们来分别罗列一下一些可行的方案。

找出个子“最高的10个”同学

• 如果全校学生数量不多的话,把全校的同学都拉到操场由矮到高依次排队,排在最后的10个同学自然就是个子最高的。

• 先在各个班级内部排队比较,找出本班级内个子最高的10个同学,然后把每个班级选出来的10个人拉到操作去排队,排在最后的10个同学是个子最高的。

• 先随机找10个同学作为标杆,让全校的同学依次来跟这10个同学比较一下身高,比10个同学中的任何一个都矮就不管,比任何一个高的就留下来,同时让原来10个同学中最矮的同学离开,经过一轮对比,最后留下来的10个同学是个子最高的。

查找姓名是“张三”的同学

• 由于存在相同姓名的同学,所以可以依次把全校的同学都问一遍:“你是不是叫张三?”,然后把回答“是”的人都记录下来。

• 假设事先能打听到那些班级里有叫“张三”的同学,然后直接去这些班级里依次问一下。

查找学号是“666”的同学

• 由于学号是全校唯一的,可以直接找到这个同学。

上面举例了几个生活中的关于查找的场景,可以发现对于不同需求不同场景,我们是可以选择不同的方案来达到目的的,只不过不同的方案在效率上会有所不同。比如如果学校有上万的学生,全部拉到操场依次排队的方案就比较耗时,又比如事先能知道某些前提条件(比如知道那些班级有姓名是“张三”的同学),就可以加快查找的过程。

我们把思维转换一下,如果把上述生活中的场景映射到MySQL数据库会是怎么样的呢?不同的场景下,MySQL会如何来查找数据呢?

我们都知道MySQL的一些概念,比如全表扫描、索引等,也知道利用索引可以加快查找数据的过程,不过具体到MySQL内部,全表扫描具体是怎么一回事呢?索引的结构是怎么样的呢?按索引查找数据具体又是如何工作的呢?

如果大家对上面的一连串问题还不清楚的话,请继续看下面的分析。

为了更好的进行说明,假设我们现在有一个学生表,然后有学号ID(主键)、姓名name两个字段,除主键ID外,还给姓名字段创建了一个普通索引,建表语句如下:

CREATE TABLE `student` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID、学号',
  `name` varchar(32) NOT NULL COMMENT '姓名',
  PRIMARY KEY (`ID`) USING BTREE,
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
(备注:我相信大家都是知道MySQl有索引这个概念的,而且今天的文章默认都是讲解innodb存储引擎的索引。)

相信大家都看得懂上面的SQL语句的,然后我们也直接用主键ID表示学号。接下来往这个表里插入了1千条记录(表示学校有1000个学生),主键ID(学号)的值就是从1到1000,然后姓名name依次是name1到name1000,插入语句如下:

INSERT INTO student (id, `name`) VALUES 
(1, 'name1'),
(2, 'name2'),
(3, 'name3'),
... 
(999, 'name999'),
(
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值