主要内容
- MySQL索引什么时候会失效
- 算法题:圆圈中最后剩下的数
MySQL索引什么时候会失效
首先进行一个简单的总结,索引失效大致可以分为以下几种情况:
- 复合索引使用不当导致索引失效
- like是以“%”开头的情况
- 使用OR关键字的查询语句
- 其它
下面对这些情况分别进行分析:
复合索引使用不当导致索引失效
复合索引又被称为联合索引。是指两个或两个以上的列上的索引。对于复合索引,MySQL从左到右的使用索引中的字段,一个查询可以只使用复合索引中的部分,当必须时最左侧的部分。
假如我们现在有这么一张表:
1 | create table test( |
select * from test where a=1,b=2,c=3这个查询使用到了a,b,c三个索引select * from test where a=1,b=2这个查询使用到了a,b两个索引select * from test where a=1,c=3这个查询只使用到了a这个所用,因为没有使用b这个索引,导致了c索引失效
select * form test where a=1,b>2,c=3,这个查询使用到了a,b,但没有使用到c,因为b是范围值,所以之后的索引c失效了
select * from test where a>1,b=2,c=3,这个查询只有a用到了索引,b,c索引失效了。
select * from test where b=2.c=3这个查询没有用到任何的索引,b,c都失效了
select * from test where a=1 order by b这个查询用到了索引a,并且排序也用到了索引b
select * from test where a=1 order by c这个查询用到了索引a,但是排序并没有用到任何索引
like是以“%”开头的情况
比如如下的SQLselect * from test where a like '%efg'这个查询因为”%”出现在了最开头,所以造成了索引失效.
而如果不是在开头,索引就不会失效.select * from test where a like 'ef%'这个查询就用到了索引
那么如何让like '%字符串%'用上索引呢?
可以使用覆盖索引来解决,是查询的字段都包含在索引里,这样能用上索引
使用OR关键字的查询语句
select * from test where a=2 or b=3这个查询是能够使用到索引的,当查询条件中只有or关键字,且or前后的两个条件中列都是索引时,索引才会生效。
其它
比如在索引列上进行了计算,函数,类型转换等会造成索引失效。
使用 is null is not null也无法使用索引
字符串不加单引号也会照成索引失效
算法题:圆圈中最后剩下的数
题目:
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
如果没有小朋友,请返回-1
分析:这个就是一个典型的约瑟夫环问题,可以使用链表或数组来实现。
解法:
1 | import java.util.*; |