Given an unsorted array of integers, find the length of longest increasing subsequence.
mysql优化
MySQL优化
SQL语句优化
(1)使用limit对查询结果的记录进行限定
(2)避免select *,将需要查找的字段列出来
(3)使用连接(join)来代替子查询
(4)拆分大的delete或insert语句
选择合适的数据类型
(1)使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob
(2)使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数
(3)使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar
(4)尽可能使用not null定义字段
(5)尽量少用text,非用不可最好分表
选择合适的索引列
(1)查询频繁的列,在where,group by,order by,on从句中出现的列
(2)where条件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出现的列
(3)长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好
(4)离散度大(不同的值多)的列,放在联合索引前面。查看离散度,通过统计不同的列值来实现,count越大,离散程度越高:
1 | mysql> SELECT COUNT(DISTINCT column_name) FROM table_name; |
使用命令分析
参考文献
慢查询测试
首先,创建一张表books
1 | create table books (id int not null auto_increment, ISBN bigint not null, book_name varchar(20) not null, author varchar(50), publish_date varchar(20), description varchar(500), publish_organization varchar(30), total_pages int not null, primary key(id))ENGINE=InnoDB DEFAULT CHARSET=utf8; |
显示表结构及内容:
插入数据:
1 | insert into books (ISBN, book_name, author, publish_date, description, publish_organization, total_pages) values |
416. Partition Equal Subset Sum
Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.
背包问题
- 01背包问题:每个物品最多选一次
- 完全背包问题:每个物品可以选任意多次
- 多重背包问题:每个物品可选次数上限不同
- 混合背包问题:
- 二维费用背包问题:分组背包问题,物品先分组,组内物品之间互斥
- 背包问题求方案数
- 求背包问题的方案
- 有依赖的背包问题
参考文献
[1]视频:https://www.bilibili.com/video/av33930433?from=search&seid=9243114481874096821
synchronized关键字
synchronized关键字的作用是能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。
synchronized是Java的关键字,被Java语言原生支持;synchronized是最基本的互斥同步手段。
谈谈线程池:ThreadPoolExecutor
在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:
如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处理实际的用户请求的时间和资源更多。
所以线程池出现了。线程池为线程声明周期的开销和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。
使用线程池的好处:
- 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,
- 使用线程池可以进行统一的分配,调优和监控。
Java中的线程池是用ThreadPoolExecutor类来实现的。
线程池由任务队列和工作线程组成,它可以重用线程来避免线程创建的开销,在任务过多时通过排队避免过多线程来减少系统资源消耗和竞争,确保任务有序完成。ThreadPoolExecutor继承自AbstractExecutorService实现了ExecutorService接口,ScheduledThreadPoolExecutor继承自ThreadPoolExecutor实现了ExecutorService和ScheduledExecutorService接口。
参考文献
[1]线程池的使用:https://www.imooc.com/article/51147
[2]简单实现线程池:https://www.cnblogs.com/alimayun/p/9054027.html