主要内容

  1. MySQL索引什么时候会失效
  2. 算法题:圆圈中最后剩下的数

MySQL索引什么时候会失效

首先进行一个简单的总结,索引失效大致可以分为以下几种情况:

  1. 复合索引使用不当导致索引失效
  2. like是以“%”开头的情况
  3. 使用OR关键字的查询语句
  4. 其它

下面对这些情况分别进行分析:

复合索引使用不当导致索引失效

复合索引又被称为联合索引。是指两个或两个以上的列上的索引。对于复合索引,MySQL从左到右的使用索引中的字段,一个查询可以只使用复合索引中的部分,当必须时最左侧的部分。

假如我们现在有这么一张表:

1
2
3
4
5
6
create table test(
a int,
b int,
c int,
KEY a(a,b,c)
);

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是以“%”开头的情况

比如如下的SQL
select * 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.*;
public class Solution {
public int LastRemaining_Solution(int n, int m) {
if(n<1||m<1){
return -1;
}
List<Integer> list=new LinkedList<>();
for(int i=0;i<n;i++){
list.add(i);
}
int cur=-1;
while (list.size()>1){
for(int i=0;i<m;i++){
cur++;
if(cur==list.size()){
cur=0;
}
}
list.remove(cur);
cur--;
}
return list.get(0);

}
}