字典序/MySQL索引=======今日工作总结

1.求字典序在s1和s2之间的,长度在len1到len2的字符串的个数,结果mod 1000007。借此题写了一些字典序的问题。

1.1求解字典序小于某一字符串的字串数?

public static void getRes(String str){//用于求出字典序小于某一个字符串的字符串个数
long sum=0;
int len=str.length();
long val=0,beforeVal=1;
for(int i=0;i<str.length();i++){
val=str.charAt(i)-97;
if(i<len-1)val=val+1;
sum=sum+val;//第一种情况的值
sum=sum+(beforeVal-1)*26;//第二种情况的值
beforeVal=val+(beforeVal-1)*26;
}
System.out.println(sum);
}

1.2求解字典序小于某一字符串,且长度为某一定值的字串数?

public static void getRes(String str,int len){//用于求出字典序小于某一个字符串的字符串个数,len表示所求子串长度
long sum=0;
String subStr=str.substring(0,len);
long val=0,beforeVal=1;
for(int i=0;i<subStr.length();i++){
val=subStr.charAt(i)-97;
if(i<len-1)val=val+1;
if(i==len-1){
sum=sum+val;//第一种情况的值
sum=sum+(beforeVal-1)*26;//第二种情况的值
}
beforeVal=val+(beforeVal-1)*26;
}
System.out.println(sum);
}

2.已知某公司总人数为W,平均年龄为Y岁(每年3月末计算,同时每年3月初入职新人),假设每年离职率为x,x>0&&x<1,每年保持所有员工总数不变进行招聘,新员工平均年龄21岁。 从今年3月末开始,请实现一个算法,可以计算出第N年后公司员工的平均年龄。(最后结果向上取整)。

误区:随着年份的增加,“旧人”的年龄也会增加

MySQL数据库索引

1.联合索引为什么要遵循最左前缀原则?


如上图所示,创建了联合索引(last_name,first_name,dob),数据库建立的索引结构如图所示,它是以第一个字段来建立索引的,在B-Tree中保留了第一个和第二个字段的数据信息,所以使用联合索引时,必须遵循最左前缀原则。

2.哈希索引的问题?

目前在MySQL数据库中,只有Memory存储引擎支持哈希索引,哈希索引的数据结构如下所示:


在哈希索引中,对于等值查找速度很快,直接计算得到相应的槽,从而得到行指针,进而得到数据。但是哈希索引有它的不足之处,对于范围查询、排序等就显得无能为力了。

3.InnoDB引擎中的“自适应哈希索引”介绍?

如果我们在字段URL上建立了索引,如果经常使用这个字段进行查询操作,我们可以在数据表上新增一个字段,这个字段与URL是一一映射的关系(尽可能),我们可以通过CRC32将URL映射为整型字段,这样以整型字段进行索引,可以提高索引效率。

4.联合索引中多字段前后关系的问题,应该将那个字段放在最前面?

一般会将索引选择性高的字段放在前面,这样使用索引进行信息查询时,可以过滤掉尽可能多的数据行。索引的选择性指的是,不重复的索引值和数据表的总行数的比值,如主键的索引选择性是1,唯一性索引的选择性也是1。

5.聚簇索引?

当表有聚簇索引是,它的数据行实际上存放在索引的叶子页中,“聚簇”表示数据行和相邻的键值紧凑地存储在一起,因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。


6.MyISAM和InnoDB存储引擎数据分布?

假设有数据表tab(col1,col2),其中col1是主键索引,col2是普通索引,假设数据表如下所示:


对于MyISAM存储引擎的col1索引结构如下所示:


对于MyISAM存储引擎的col2索引结构如下所示:

其中MyISAM存储引擎的叶节点中存储的是“行指针”。

对于InnoDB存储引擎的col1索引结构如下所示:

对于InnoDB存储引擎的col2索引结构如下所示:


其中col2索引的叶结点中存储的不是“行指针”,而是存储的主键值。col2主键索引中叶节点存储的是整行数据。

7.MySQL语句执行流程?


MySQL客户端和服务器端之间的通信协议是“半双工”的。

如查询优化器可以对查询SQL语句进行优化,如将(5=5 and a>5)改写为a>5;优化COUNT()、MIN()和MAX()等,在MyISAM存储引擎中,会维护数据表行数信息;MIN()会查询B-Tree索引结构最左端记录;MAX()会查询B-Tree索引结构最右端记录。

猜你喜欢

转载自blog.csdn.net/ylf_2278880589/article/details/80606790