mysql索引——为啥用自增数字来作为主键的理解和using index、Using index condition、using where的一些

2021/9/18 19:08:38

本文主要是介绍mysql索引——为啥用自增数字来作为主键的理解和using index、Using index condition、using where的一些,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

最近mysql数据库被问爆了哈哈哈,反正也不打算卷大厂了,被问爆就被问爆吧,但是该学还是给学,在读极客时间的mysql文章链文章接,最近给自己又放了半个月假,现在开始好好学学习,现在也希望我秋招满意的公司快点和我谈薪,一年有个30就继续躺平了,没有的话就站起来面试哈哈哈

以前还真不知道小小索引有那么多好玩的地方,记录下以前知道/不知道的一些东西

索引就是书的目录,加速你查找你想要的东西。

主键索引和二级索引(可以理解为非主键索引),非主键索引就需要有个回表操作在通过主键来找到想要的数据,所以叫做二级索引,这是我以前了解过的,也知道很多时候会用自增的id来作为主键,但这是为啥我还真不清楚。就跟文章例子一样吧,也拿身份证举例子,int是4个字节的,身份证号是字符串类型,18位就是算18个字节,那二级索引底下挂着都是主键,如果用身份证号作为主键,二级索引底下挂着的主键都是要18个字节,而用自增的id是不是就只需要4个字节了?没错,就是这样的,所以很多时候用int作为主键是可以省空间的。那为啥要自增呢?因为数据都是按页来的,如果突然插入到某一个地方,他前后都有数据,但是后面已经不能在添加数据,这时候会产生新的页,在移动数据,这样很明显很耗时,自增我尾后追加即可,那里需要移动数据这么麻烦的操作。这就解释了为什么自增和用数字做主键的主要原因了。

一张数据库表是由多个B+树组成的,每创建一个索引就是创建一个B+树。

explain显示的是using index就是用到了覆盖索引,就是不需要回表操作了。

联合索引,创建(a,b)联合索引可以看成(a,b),a这两个索引,如果项目数据a,b联合用的多,a也多,b也多,那也要考虑a和b那个字段短,短的数据再新开一个索引即可,长的字段放在联合索引的左侧。

建一张表来理解一下 Using where; Using index,Using index condition。课程是name age的联合索引,我建了一个id_card name age 的联合索引来做测试

CREATE TABLE `tuser` (
  `id` int(11) NOT NULL,
  `id_card` varchar(32) DEFAULT NULL,
  `name` varchar(32) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `ismale` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB

执行下面sql语句

mysql> select * from tuser where name like '张%' and age=10 and ismale=1;

Using index condition回表的时候少回了一些数据。
图三是没Using index condition优化情况,图四是有优化的情况。
在这里插入图片描述

我执行了很多sql语句,我个人猜测Using index condition是回表才会显示出来的
在这里插入图片描述
而如果用到了索引不需要回表但是没满足最左匹配原则,他会是Using where; Using index 状态。我的理解是在这个联合索引上还是使用where过滤的条件,不需要全表扫描一遍(type字段不是ALL),也用到了索引上面的主键,避免了回表操作。
在这里插入图片描述



这篇关于mysql索引——为啥用自增数字来作为主键的理解和using index、Using index condition、using where的一些的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程