目录

1、数据库高并发解决方案

2、Hash索引和B+树所有有什么区别或者说优劣呢?

3、在建立索引的时候,都有哪些需要考虑的因素呢?

4、联合索引是什么?为什么需要注意联合索引中的顺序?

5、那么在哪些情况下会发生针对该列创建了索引但是在查询的时候并没有使用呢?

5、为什么要尽量设定一个主键?

6、字段为什么要求定义为not null?

7、如果要存储用户的密码散列,应该使用什么字段进行存储?

8、MySQL中的varchar和char有什么区别?

9、varchar(10)和int(10)代表什么含义?

10、MySQL的binlog有有几种录入格式?分别有什么区别?

11、超大分页怎么处理?

12、对于横向分表和纵向分表,可以分别举一个适合他们的例子吗?

13、什么是存储过程?有哪些优缺点?

14、如何保证缓存与数据库的双写一致性?

15、读请求长时阻塞

16、给我说说你平时是如何优化MySQL的?

16.1 EXPLAIN

16.2 、SQL语句中IN包含的值不应过多

16.3 SELECT语句务必指明字段名称

16.4 当只需要一条数据的时候,使用limit 1

16.5 尽量用union all代替union

16.6  区分in和exists, not in和not exists

16.7 避免在 where 子句中对字段进行 null 值判断

17、SQL语句中‘相关子查询’与‘非相关子查询’有什么区别?

18、你可以用什么来确保表格里的字段只接受特定范围里的值?

19、NULL是什么意思

20、SQL注入漏洞产生的原因?如何防止?

21、乐观锁 与 悲观锁


1、数据库高并发解决方案

  • 页面静态化- 用户可以直接获取页面,不用走那么多流程,比较适用于页面不频繁更新。
  • 使用缓存- 第一次获取数据从数据库准提取,然后保存在缓存中,以后就可以直接从缓存提取数据。不过需要有机制维持缓存和数据库的一致性。
  • 使用储存过程-那些处理一次请求需要多次访问数据库的操作,可以把操作整合到储存过程,这样只要一次数据库访问就可以了。
  • 批量读取 - 高并发情况下,可以把多个请求的查询合并到一次进行,以减少数据库的访问次数
  • 延迟修改 - 高并发情况下,可以把多次修改请求,先保存在缓存中,然后定时将缓存中的数据保存到数据库中,风险是可能会断电丢失缓存中的数据。
  • 使用索引 - 索引可以看作是特殊的缓存,尽量使用索引就要求where字句中精确的给出索引列的值。
  • 分表 - 把本来同一张表的内容,可以按照地区,类别等分成多张表,很简单的一个思路,但是要尽量避免分出来的多表关联查询。
  • 分离活跃数据 - 例如登录用户业务,注册用户很多,但是活跃的登录用户很少,可以把活跃用户专门保存一张表,查询是先查询活跃表,没有的话再查总表,这也类似与缓存啦。
  • 分块 - 数据库层面的优化,对程序是透明的,查询大数据只用找到相应块就行;如交易模块
  • 集群 - 将并发请求分配到不同的服务器上,可以是业务应用服务器APP,也可以是数据库服务器。
  • 分布式 - 分布式是把单次请求的多项业务逻辑分配到多个服务器上,这样可以同步处理很多逻辑,一般使用与特别复杂的业务请求。
  • CDN - 在域名解析层面的分流,例如将华南地区的用户请求分配到华南的服务器,华中地区的用户请求分配到华中的服务器。
  • 水平拆分【分表】:对于访问极为频繁且数据量巨大的单表来说,首先要做的是减少单表的记录条数,以便减少数据查询所需的时间,提高数据库的吞吐,这就是所谓的分表【水平拆分】
  • 垂直拆分【分库】:是根据业务耦合性,将关联度低的不同表存储在不同的数据库上,对数据库进行拆分,从而提高数据库写入能力,即分库【垂直拆分】。建立主从 - 读写分离就是只在主服务器上写,只在从服务器上读,基本原理是让主数据库处理事务性查询,而从数据库处理select查询,数据库复制被用于把事务性查询(增删改)导致的改变;以毫秒级的更新同步到集群中的从数据库。

2、Hash索引和B+树所有有什么区别或者说优劣呢?

  • hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询.
  • hash索引不支持使用索引进行排序
  • hash索引不支持模糊查询以及多列索引的最左前缀匹配.
  • hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询.
  • hash索引虽然在等值查询上较快,但是不稳定.性能不可预测,当某个键值存在大量重复的时候,发生hash碰撞,此时效率可能极差.而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低.

3、在建立索引的时候,都有哪些需要考虑的因素呢?

        建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较适合.如果需要建立联合索引的话,还需要考虑联合索引中的顺序.此外也要考虑其他方面,比如防止过多的索引对表造成太大的压力.这些都和实际的表结构以及查询方式有关.

4、联合索引是什么?为什么需要注意联合索引中的顺序?

        MySQL可以使用多个字段同时建立一个索引,叫做联合索引.在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引.

具体原因为:MySQL使用索引时需要索引有序,假设现在建立了"name,age,school"的联合索引,那么索引的排序为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进行排序.当进行查询时,此时索引仅仅按照name严格有序,因此必须首先使用name字段进行等值查询,之后对于匹配到的列而言,其按照age字段严格有序,此时可以使用age字段用做索引查找,,,以此类推.因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的列放在前面.此外可以根据特例的查询或者表结构进行单独的调整.

5、那么在哪些情况下会发生针对该列创建了索引但是在查询的时候并没有使用呢?

  • 使用不等于查询
  • 列参与了数学运算或者函数
  • 在字符串like时左边是通配符.类似于'%aaa'.
  • 当mysql分析全表扫描比使用索引快的时候不使用索引.
  • 当使用联合索引,前面一个条件为范围查询,后面的即使符合最左前缀原则,也无法使用索引.

5、为什么要尽量设定一个主键?

        主键是数据库确保数据行在整张表唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增长的ID列作为主键.设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全.

6、字段为什么要求定义为not null?

        null值会占用更多的字节,且会在程序中造成很多与预期不符的情况.

7、如果要存储用户的密码散列,应该使用什么字段进行存储?

        密码散列,盐,用户身份证号等固定长度的字符串应该使用char而不是varchar来存储,这样可以节省空间且提高检索效率.

8、MySQL中的varchar和char有什么区别?

        char是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容.该字段都占用10个字符,而varchar是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间.

在检索效率上来讲,char > varchar,因此在使用中,如果确定某个字段的值的长度,可以使用char,否则应该尽量使用varchar.例如存储用户MD5加密后的密码,则应该使用char.

9、varchar(10)和int(10)代表什么含义?

        varchar的10代表了申请的空间长度,也是可以存储的数据的最大长度,而int的10只是代表了展示的长度,不足10位以0填充.也就是说,int(1)和int(10)所能存储的数字大小以及占用的空间都是相同的,只是在展示时按照长度展示。

10、MySQL的binlog有有几种录入格式?分别有什么区别?

有三种格式,statement,row和mixed.

  • statement模式下,记录单元为语句.即每一个sql造成的影响会记录.由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制.

  • row级别下,记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大.

  • mixed. 一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row.

此外,新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录.

11、超大分页怎么处理?

  • 数据库层面,这也是我们主要集中关注的(虽然收效没那么大),类似于select * from table where age > 20 limit 1000000,10这种查询其实也是有可以优化的余地的. 这条语句需要load1000000数据然后基本上全部丢弃,只取10条当然比较慢. 当时我们可以修改为select * from table where id in (select id from table where age > 20 limit 1000000,10).这样虽然也load了一百万的数据,但是由于索引覆盖,要查询的所有字段都在索引中,所以速度会很快. 同时如果ID连续的好,我们还可以select * from table where id > 1000000 limit 10,效率也是不错的,优化的可能性有许多种,但是核心思想都一样,就是减少load的数据.
  • 从需求的角度减少这种请求….主要是不做类似的需求(直接跳转到几百万页之后的具体某一页.只允许逐页查看或者按照给定的路线走,这样可预测,可缓存)以及防止ID泄漏且连续被人恶意攻击.

解决超大分页,其实主要是靠缓存,可预测性的提前查到内容,缓存至redis等k-V数据库中,直接返回即可.

12、对于横向分表和纵向分表,可以分别举一个适合他们的例子吗?

        横向分表是按行分表.假设我们有一张用户表,主键是自增ID且同时是用户的ID.数据量较大,有1亿多条,那么此时放在一张表里的查询效果就不太理想.我们可以根据主键ID进行分表,无论是按尾号分,或者按ID的区间分都是可以的. 假设按照尾号0-99分为100个表,那么每张表中的数据就仅有100w.这时的查询效率无疑是可以满足要求的.

纵向分表是按列分表.假设我们现在有一张文章表.包含字段id-摘要-内容.而系统中的展示形式是刷新出一个列表,列表中仅包含标题和摘要,当用户点击某篇文章进入详情时才需要正文内容.此时,如果数据量大,将内容这个很大且不经常使用的列放在一起会拖慢原表的查询速度.我们可以将上面的表分为两张.id-摘要,id-内容.当用户点击详情,那主键再来取一次内容即可.而增加的存储量只是很小的主键字段.代价很小.

13、什么是存储过程?有哪些优缺点?

        存储过程是一些预编译的SQL语句。1、更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。2、存储过程是一个预编译的代码块,执行效率比较高,一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率,可以一定程度上确保数据安全。

14、如何保证缓存与数据库的双写一致性?

最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern。读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,先更新数据库,然后再删除缓存。

最初级的缓存不一致问题及解决方案

        问题:先修改数据库,再删除缓存。如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致。

解决思路:先删除缓存,再修改数据库。如果数据库修改失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,则读数据库中旧数据,然后更新到缓存中。

比较复杂的数据不一致问题分析

        数据发生了变更,先删除了缓存,然后要去修改数据库,此时还没修改。一个请求过来,去读缓存,发现缓存空了,去查询数据库,查到了修改前的旧数据,放到了缓存中。随后数据变更的程序完成了数据库的修改。

解决方案如下:更新数据的时候,根据数据的唯一标识,将操作路由之后,发送到一个 jvm 内部队列中。读取数据的时候,如果发现数据不在缓存中,那么将重新读取数据+更新缓存的操作,根据唯一标识路由之后,也发送同一个 jvm 内部队列中。

一个队列对应一个工作线程,每个工作线程串行拿到对应的操作,然后一条一条的执行。这样的话,一个数据变更的操作,先删除缓存,然后再去更新数据库,但是还没完成更新。此时如果一个读请求过来,读到了空的缓存,那么可以先将缓存更新的请求发送到队列中,此时会在队列中积压,然后同步等待缓存更新完成。

这里有一个优化点,一个队列中,其实多个更新缓存请求串在一起是没意义的,因此可以做过滤,如果发现队列中已经有一个更新缓存的请求了,那么就不用再放个更新请求操作进去了,直接等待前面的更新操作请求完成即可。

待那个队列对应的工作线程完成了上一个操作的数据库的修改之后,才会去执行下一个操作,也就是缓存更新的操作,此时会从数据库中读取最新的值,然后写入缓存中。

如果请求还在等待时间范围内,不断轮询发现可以取到值了,那么就直接返回;如果请求等待的时间超过一定时长,那么这一次直接从数据库中读取当前的旧值。

15、读请求长时阻塞

        由于读请求进行了非常轻度的异步化,所以一定要注意读超时的问题,每个读请求必须在超时时间范围内返回。

该解决方案,最大的风险点在于说,可能数据更新很频繁,导致队列中积压了大量更新操作在里面,然后读请求会发生大量的超时,最后导致大量的请求直接走数据库。务必通过一些模拟真实的测试,看看更新数据的频率是怎样的。

另外一点,因为一个队列中,可能会积压针对多个数据项的更新操作,因此需要根据自己的业务情况进行测试,可能需要部署多个服务,每个服务分摊一些数据的更新操作。如果一个内存队列里居然会挤压 100 个商品的库存修改操作,每隔库存修改操作要耗费 10ms 去完成,那么最后一个商品的读请求,可能等待 10 * 100 = 1000ms = 1s 后,才能得到数据,这个时候就导致读请求的长时阻塞。

一定要做根据实际业务系统的运行情况,去进行一些压力测试,和模拟线上环境,去看看最繁忙的时候,内存队列可能会挤压多少更新操作,可能会导致最后一个更新操作对应的读请求,会 hang 多少时间,如果读请求在 200ms 返回,如果你计算过后,哪怕是最繁忙的时候,积压 10 个更新操作,最多等待 200ms,那还可以的。

如果一个内存队列中可能积压的更新操作特别多,那么你就要加机器,让每个机器上部署的服务实例处理更少的数据,那么每个内存队列中积压的更新操作就会越少

16、给我说说你平时是如何优化MySQL的?

 16.1 EXPLAIN

做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。

  • type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别

  • key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式

  • key_len列,索引长度

  • rows列,扫描行数。该值是个预估值

  • extra列,详细说明。注意常见的不太友好的值有:Using filesort, Using temporary

16.2 、SQL语句中IN包含的值不应过多

        MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from table_name where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了;再或者使用连接来替换。

16.3 SELECT语句务必指明字段名称

SELECT *增加很多不必要的消耗(cpu、io、内存、网络带宽);增加了使用覆盖索引的可能性;当表结构发生改变时,前断也需要更新。所以要求直接在select后面接上字段名。

16.4 当只需要一条数据的时候,使用limit 1

这是为了使EXPLAIN中type列达到const类型

16.5 尽量用union all代替union

       union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。当然,union all的前提条件是两个结果集没有重复数据。

16.6  区分in和exists, not in和not exists

       

select * from 表A where id in (select id from 表B)
<=>
select * from 表A where exists
(select * from 表B where 表B.id=表A.id)

         区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。所以IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

关于not in和not exists,推荐使用not exists,不仅仅是效率问题,not in可能存在逻辑问题。

16.7 避免在 where 子句中对字段进行 null 值判断

        对于null的判断会导致引擎放弃使用索引而进行全表扫描。

 17、SQL语句中‘相关子查询’与‘非相关子查询’有什么区别?

子查询:嵌套在其他查询中的查询。子查询又称内部查询,而包含子查询的语句称之外部查询(又称主查询)。所有的子查询可以分为两类,即相关子查询和非相关子查询

(1)非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。

(2)相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。

故非相关子查询比相关子查询效率高

18、你可以用什么来确保表格里的字段只接受特定范围里的值?

  • Check限制,它在数据库表格里被定义,用来限制输入该列的值。
  • 触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能

19、NULL是什么意思

NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 NULL值进行比较,并在逻辑上希望获得一个答案。

20、SQL注入漏洞产生的原因?如何防止?

SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。

     防止SQL注入的方式:

  • 开启配置文件中的magic_quotes_gpc 和 magic_quotes_runtime设置

  • 执行sql语句时使用addslashes进行sql语句转换

  • Sql语句书写尽量不要省略双引号和单引号。

  • 过滤掉sql语句中的一些关键词:update、insert、delete、select、 * 。

  • 提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。

  • 控制错误信息,不要在浏览器上输出错误信息,将错误信息写到日志文件中。

21、乐观锁 与 悲观锁

    悲观锁

        在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作在某行数据上应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。

 悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。

优点与不足:

优点:悲观并发控制实际上是采用“先取锁再访问”的保守策略,为数据处理的安全性提供了保证;
缺点:在效率方面,处理加锁的机制会让数据库产生额外的开销,同时会增加产生死锁的机率;另外,在只读型事务中由于不会产生冲突,也没必要使用锁,这样做只会增加系统负载;还会降低并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数。

乐观锁

在关系数据库管理系统里,乐观并发控制(又名“乐观锁”,Optimistic Concurrency Control,缩写“OCC”)是一种并发控制的方法。它假设多用户并发的事务在处理数据时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务对该数据做过修改。如果其他事务更新过该数据的话,正在提交的事务会进行回滚。

乐观锁( Optimistic Locking )是相对悲观锁而言,乐观锁假设数据一般情况下不会造成冲突,所以在事务对数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回错误信息,让用户决定如何去做。

相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制,一般用记录数据版本的方式实现乐观锁。实现数据版本有两种方式,第一种是使用版本号,第二种是使用时间戳。

        

Mysql面试题总结(二)相关推荐

  1. 最全面的MySQL面试题大全-二

    继续上篇博客的内容,进行详细的分析以及查询操作. 5. 查询所有同学的学生编号.学生姓名.选课总数.所有课程的总成绩(没成绩的显示为 null ) 分析:看到这道题,首先需要考虑要获得学生姓名以及学生 ...

  2. 企业面试题|最常问的MySQL面试题集合(二)

    MySQL的关联查询语句 六种关联查询 交叉连接(CROSS JOIN) 内连接(INNER JOIN) 外连接(LEFT JOIN/RIGHT JOIN) 联合查询(UNION与UNION ALL) ...

  3. linux mysql怎么样_最强Linux和Mysql面试题套餐,让你的面试无懈可击!

    引言: 大家好,我是一菲,在软件测试当中linux 操作系统和Mysql数据库的内容是十分的知识同时也是十分重要的.所以一菲这两天通过查阅资料等其他方式为大家梳理了liunx和Mysql面试题大礼包, ...

  4. 最常问的MySQL面试题集合

    除了基础题部分,本文还收集整理的MySQL面试题还包括如下知识点或题型: MySQL高性能索引 SQL语句 MySQL查询优化 MySQL高扩展高可用 MySQL安全性 问题1:char.varcha ...

  5. mysql数据库的三级模式_2016年计算机三级MySQL数据库试题

    2016年计算机三级MySQL数据库试题 一.选择题 1.E-R图提供了表示信息世界中实体.属性和________的方法. A.数据 B.联系 C.表 D.模式 2.数据库系统的核心是________ ...

  6. mysql面试题总结

    mysql面试题总结 Mysql中的myisam与innodb的区别? InnoDB存储引擎的四大特性? 什么是事务? 数据库事务的四大特性? 不考虑事务的隔离性,会发生几种问题? MySQL数据库提 ...

  7. MySQL操作数据库语法及常见MySQL面试题与答案

    MySQL操作数据库语法 ## 创作不易点点关注,这样我才有更大的动力!**** 操作数据库 结构化查询语句分类 名称 解释 命令 DDL(数据定义语言) 定义和管理数据对象,如数据库,数据表等 CR ...

  8. mysql和linux的题目_最强Linux和Mysql面试题套餐,让你的面试无懈可击!

    引言: 大家好,我是一菲,在软件测试当中linux 操作系统和Mysql数据库的内容是十分的知识同时也是十分重要的.所以一菲这两天通过查阅资料等其他方式为大家梳理了liunx和Mysql面试题大礼包, ...

  9. 精品MySQL面试题

    MySQL面试题目录 前言 99%必问的十道题 唯一索引比普通索引快吗, 为什么 MySQL由哪些部分组成, 分别用来做什么 MySQL查询缓存有什么弊端, 应该什么情况下使用, 8.0版本对查询缓存 ...

  10. 企业面试题|最常问的MySQL面试题集合(一)

    问题1:char.varchar的区别是什么? varchar是变长而char的长度是固定的.如果你的内容是固定大小的,你会得到更好的性能. 问题2: TRUNCATE和DELETE的区别是什么? D ...

最新文章

  1. LeetCode 832 Flipping an Image
  2. 若所有的参数皆需要类型转换——请为此采用non-member函数
  3. C++ 编译,运行过程 详解。
  4. Netflix 如何使用机器学习来提升流媒体质量
  5. java 统计图 mysql_java实现各种数据统计图(转)
  6. Python模块(3)--PIL 简易使用教程
  7. 第十章:禁丹药,禁符纸
  8. 容易被忽略的label标签
  9. 时序图如何表现分支_【Video Recognition】在视频分类任务中如何高效使用3D卷积...
  10. java线程池_Java 线程池 8 大拒绝策略,面试必问!
  11. excel loc() python_python pandas df.loc[]的典型用法
  12. 3.Docker技术入门与实战 --- 使用Docker镜像
  13. CZMDUI,简约而不简单的typecho模板
  14. 关于如何创造VBS编程语言环境
  15. android qq 文件怎么恢复,恢复QQ接收文件的文件夹被误删除了的方法
  16. 分享 | 智慧水务建设方案
  17. 大白小课程-跟着官方教程学习Scratch3.0-P04制作音乐
  18. 微信隐藏功能:群接龙
  19. 计算机等级考网络课程答案,《计算机应用基础》课程考试试卷
  20. IO之 java中BIO NIO AIO原理、区别以及应用

热门文章

  1. .net全套视频教程
  2. element-ui 表格第一列随滚动自动吸顶
  3. vivo手机的便签批量导出到huawei手机备忘录
  4. 【 螺旋方阵 】所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
  5. springboot 论坛项目
  6. 《这些道理没有人告诉过你》_阅读笔记
  7. window 7 计算机配置文件,怎么用WIN7转移整台老电脑配置与文件到新电脑
  8. 如何清空c盘只剩系统_彻底清理C盘垃圾怎么操作?
  9. Symbian操作系统及操作平台界面详解
  10. stitcher源码阅读