周日,是干活的一天,补周六活的一天。
上午11多起床,看学术交流。
下午还是复习学术交流和英语写译,2点到3.30多,看学术交流,看了2章。
看写译,1个多小时,感觉也没看进去什么,反正是把课后的翻译给整理了一下,方便接下去几天看。
然后去刷题:
1道简单
- 七进制数
给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。
int i=1;
int chushu;
int sign=1;
if(num<0)
{
num=abs(num);
sign=-1;
}
while(1)
{
int sum=1;
for(int j=0;j<i;j++)
{
sum=sum*7;
}
if(num/sum==0)
{
break;
}
i++;
}
vector<int> shuzi;
for(int j=i;j>1;j--)
{
int sum=1;
for(int k=0;k<j-1;k++)
{
sum=sum*7;
}
int a=num/sum;
shuzi.push_back(a);
num=num%sum;
}
shuzi.push_back(num);
string ans="";
if(sign<0)
{
ans=ans+'-';
}
for(int j=0;j<shuzi.size();j++)
{
char ch=shuzi[j]+'0';
ans=ans+ch;
}
return ans;
效率还是蛮高的,能干到100%,改改应该能变成其他位数的转化了。
一道中等,直接反转整数,没什么好说的。
还有一道中等,写一半不对劲,写不出来了。
晚上是数据库,把SQL优化的部分结束了:
order by优化
- Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区 sort buffer 中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序
-
Using index:通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要额外排序,操作效率高
无索引排序:
image.png
添加索引:
image.png
创建的是age,phone的联合索引
image.png
phone违背最左前缀,无法使用索引。
image.png
一个升序,一个降序,同样出现问题。
● 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则
● 尽量使用覆盖索引
● 多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)
● 如果不可避免出现filesort,大数据量排序时,可以适当增大排序缓冲区大小 sort_buffer_size(默认256k)
group by优化
● 在分组操作时,可以通过索引来提高效率
● 分组操作时,索引的使用也是满足最左前缀法则的
创建prfession,age,status的联合索引
select age,count(*) from tb_user where profession='软件工程' group by age;
同样满足最左前缀法则
limit优化
常见的问题如limit 2000000, 10,此时需要 MySQL 排序前2000000条记录,但仅仅返回2000000 - 2000010的记录,其他记录丢弃,查询排序的代价非常大。
优化方案:一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化
创建子表
select id from tb_sku order by id limit 9000000, 10;
连接子表
select * from tb_sku as s, (select id from tb_sku order by id limit 9000000, 10) as a where s.id = a.id;
count优化
MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count() 的时候会直接返回这个数,效率很高(前提是不适用where);
InnoDB 在执行 count() 时,需要把数据一行一行地从引擎里面读出来,然后累计计数。
count(字段)只计算字段值不为NULL的行
count():InnoDB 引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加
按效率排序:count(字段) < count(主键) < count(1) < count(),所以尽量使用 count(*)
update优化(避免行锁升级为表锁)
行锁:在这一行的事务没有提交前,其他在这行的操作无法进行。
begin;
update course set name='javaEE' where id = 1;,
这句由于id有主键索引(已经创建过索引),所以只会锁这一行,行锁。
因此,在另一个操作界面update course set name='c' where id =4;可以正常执行
begin;
updata course set name='springboot' where name ='PHP';
这句没有索引(name没有创建索引),对整张表上锁,出现了表锁
update course set name='c' where id =4;不能正常执行
对name进行索引后,在updata过程中就不会出现表锁。



