最近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),也用到了索引上面的主键,避免了回表操作。