2025-11-23小记

周日,是干活的一天,补周六活的一天。
上午11多起床,看学术交流。
下午还是复习学术交流和英语写译,2点到3.30多,看学术交流,看了2章。
看写译,1个多小时,感觉也没看进去什么,反正是把课后的翻译给整理了一下,方便接下去几天看。
然后去刷题:
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优化

  1. Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区 sort buffer 中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序
  2. 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过程中就不会出现表锁。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容