MySQL:索引篇

什么是索引?

好比一本书的目录,它是用来提高我们查找数据的效率的。
MySQL的InnoDB引擎索引的底层算法,其实是一种叶子节点互相连通,改良版的B+Tree的数据结
构。而B+Tree其实是由B-Tree演变而来,而B-Tree的底层原理其实是二叉树!而二叉树查找数据
虽然快,其实是有一个缺点的。就是你如果要更新二叉树上的某个节点,那么那个节点下的所有
子节点都要被拿出来重新排序。这也是索引不能多的原因之一!

相关语法

 说明: t_name指表明、index_name索引名、column列名
 创建语法:
		默认索引:
		alter table t_name add index index_name (column)  
		唯一索引和全文索引把index换成unique和fulltext就行了
 在建表的时候创建索引
	  create [unique|fulltext|spatial] index index_name [算法] on t_name (字段名)

 删除:drop index index_name on t_name

 查看索引:show index from t_name

使用索引有哪些注意事项?

1.避免使用select * 尽量用索引列替换*,否则虽然使用了索引但却会回表查询。
2.单列索引一般多条件情况下数据库会选出一个最优的来用,用or条件不影响索引。
3.复合索引失效场景:
	3.1不遵守最左前缀法则
		创建一个索引abc,条件里面单独出现一个a不失效,出现a和b不失效,出现abc不失效。
		出现ac也没事只不过现在它只走a索引。
	3.2复合索引里使用or条件
		or前的条件有索引而or后的没有那么索引都失效!建议使用union
	3.3使用复合索引,如果有范围查询的话,该范围查询后面的字段索引会失效。
	3.4在索引列上进行运算操作
	3.5字符串类型不加单引号
	3.6模糊查询%加最前面
	3.7not in 不走索引
4.尽量使用复合索引少使用单列索引
5.如果MySQL计算你使用索引还不如使用全表扫描快,那么就会放弃使用索引。

如何查看索引的使用情况

![](https://img-blog.csdnimg.cn/20200906154609175.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDEwNTgwMg==,size_16,color_FFFFFF,t_70#pic_center)
在SQL语句前加上explain关键字可以清除得看到执行情况,key这个列就是索引名,没用到就是null。

问题一、怎么建立索引?精确到表里的字段。

1、	到查询多DML少的表里,选择查询多DML少的列。
2、	怎么确定哪张表查询多DML少?
		做得时候自然会清楚。
		比如用户表里的账号密码,肯定会分库配置读写分离,到负责读的数据库里建索引就行了。

问题二、为什么比起单列索引要优先考虑复合索引

因为你分别建三个a,b,c的单列索引,你在使用多条件查询的时候,数据库只会优先选取执行效
率最高的那个。
但你建一个为a,b,c的复合索引就不同了,这相当于建立了一个单列索引a,一个复合索引ab一
个复合索引abc。你a找不到就在排除a的基础上接着找ab,再找不到就进一步缩小找abc。

问题三、什么是最左前缀法则

就是在用复合索引abc的时候条件可以单独为a,也可以为a和b,a和b和c。
但不能单独为b单独为c,a和c,b和c。

问题四、什么是回表查询

通过普通索引只是定位到了一个主键索引,再通过这个主键索引真正定位到数据。这个过程虽然
用了索引,但实际上底层进行了两次索引查询,这个过程就称为回表。

问题五、模糊查询%不能加最前面,我必须要用怎么办

模糊查询条件比如like”%123”或者like“%123%”都会使索引失效!只有like “123%”能行。
那很多时候又离不开like“%123%”怎么办?
使用覆盖索引!也就是把select *替换成索引列即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值