炫“库”行动-人大金仓有奖征文-金仓库分析型数据库

金仓库活动

1.你有哪些数据库sql优化经验?

  1. 使用PrepareStatement语句,这个是经过预编译处理过的,比Statement的的速度要快。
  2. 如果数据的内容少,或者是有限的固定范围,可以使用Enum类型,而不是varchar类型
  3. 可以通过分布式的数据库系统增加数据库的性能,提高数据库的速度
  4. 可以通过不同的连接池来进行访问数据库的访问,比如Druid,HikariCP.HikariCp号称性能最好的连接池,这个是为什么?
  5. 使用Union进行连表查询比Union All进行连表查询可以大大提高性能,
    Union好处:
6. 可以进行排序功能
7. 可以进行去除重复
  1. 可以使用单表查询的尽量使用单表,可以大大的提高查询的的速度,尽量少使用子查询
  2. select * from tb group by name order by null; group by后面已经默认进行了排序,你可以它不用排序,进行提高相关的性能。
    10.分页查询的limit,我们会查询也很多的数据以后再摒弃不符合条例的数据,这样会大大的降低查询的效率。我们可以通过查询索引进行,或者通过改变它的查询的位置。
SELECT * FROM user u 
LEFT JOIN (SELECT id FROM user LIMIT 1000,10) AS d ON d.id=u.id
SELECT * FROM user WHERE id > 1000 LIMIT 10
  1. 使用Truncate代替delete操作
    当你真的确定删除这个表中的数据的时候使用 truncate删除表中的数据使用的资源很少,比delete使用的少很多,但是数据不可以被恢复。
  2. 不要在where子句中对数据库的字段进行null的判断,或者使用!=,这样会使mysql放弃索引,进行全表的扫描,效率低,in和not in 也要慎用,可以用between代替
  3. 索引不是越多越好,我们需要建立适当的索引,它会影响insert和update的执行的效率,一张表的索引最好不要超过6个
  4. 避免频繁的创建和删除临时表,可以减少系统表的资源的消耗。
  5. 事务的操作不要过多,这样可以提高系统的并发能力
    用合适的方法生成相应的索引
索引可以用UUID.random().toString()进行生成,
和使用时间戳+随机数进行生成,这样的索引可以有唯一的标识。
使用雪花算法生成相应的id
  1. 刚开始的索引长度不要太长,可能会引起查询的效率的降低。可以使用subString()截取其中的一段就好。
  2. 数据库查询可以自定义变量来进行查询,力扣上面的题目很多老师自定义变量。
  3. 使用一些nosql数据库来为Mysql数据库进行减轻负担,比如查询放在缓存中,直接通过redis进行查询,它是单线程的,又是通过内存进行访问可以很大的提高效率,通过MongoDB来解决操作频繁的海量的数据,比如吐槽,评论的数据,不是特别重要。
  4. 数据库的表可以在需要建立外键约束。
  5. 有时候可以使用位运算来提高sql语句的运行速度问题。

2.使用Redis有什么好处?

  1. redis是依靠单线程来运行,这样性能更加的突出
  2. 可以进行持久化操作(AOF(日志文件),RDB(内存快照))
  3. 数据存储在内存中,速度快,类似于HashMap的查询,时间复杂度为o(1)
  4. 支持丰富的数据类型,String,set,sorted set,hash,list
  5. 支持事务操作,具有事务的ACID属性,要么一起改变,要么不发生改变
  6. 丰富的特性:可以为mysql数据库分担很多,用于缓存,消息,队列,计数器/排行榜,发布订阅点赞等等。
  7. 支持数据备份,通过master-slave进行数据的备份

3.Redis集群如何选择数据库?

目前无法做数据库选择,默认使用0数据库。

4.MongoDB的使用场景?

  1. 数据量大
  2. 写入操作频繁
  3. 价值较低
  4. 比如吐槽,评论可以使用这个数据库

5 什么是MongoDB?

是最像sql的数据库的nosql数据库,最大特点,支持的查询语言非常强大,语法类似于面向对象的查询语言,是一个跨平台,面向文档的数据库,是当前的Nosql数据库8产品中最热门的一种。是Nosql数据库中功能最丰富的。支持的数据库结构松散,类似 于Json的Bson格式,可以存储复杂的数据类型。

6 实践出真理,leetCode刷mysql题目的的总结。

LeetCode题目1

有一个courses 表 ,有: student (学生) 和 class (课程)。

请列出所有超过或等于5名学生的课。

例如,表:

±--------±-----------+
| student | class |
±--------±-----------+
| A | Math |
| B | English |
| C | Math |
| D | Biology |
| E | Math |
| F | Computer |
| G | Math |
| H | Math |
| I | Math |
±--------±-----------+
应该输出:

±--------+
| class |
±--------+
| Math |
±--------+

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/classes-more-than-5-students
方法一:可以对课程进行分组,然后统计每个课程的学生的数量

扫描二维码关注公众号,回复: 13157210 查看本文章
 
#  执行用时:
# 281 ms
# , 在所有 MySQL 提交中击败了
# 69.81%
的用户
 select class from courses group by 
 class having count(distinct student)>=5;

# 执行用时:
# 285 ms
# , 在所有 MySQL 提交中击败了
# 58.01%
SELECT
    class
FROM
    (SELECT
        class, COUNT(DISTINCT student) AS num
    FROM
        courses
    GROUP BY class) AS temp_table
WHERE
    num >= 5
;

可以看出使用临时表的效率一般会比单表操作低,建议多使用单表进行操作

leetcode题目二使用位运算可以节约时间

某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。

作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列。

例如,下表 cinema:

±--------±----------±-------------±----------+
| id | movie | description | rating |
±--------±----------±-------------±----------+
| 1 | War | great 3D | 8.9 |
| 2 | Science | fiction | 8.5 |
| 3 | irish | boring | 6.2 |
| 4 | Ice song | Fantacy | 8.6 |
| 5 | House card| Interesting| 9.1 |
±--------±----------±-------------±----------+
对于上面的例子,则正确的输出是为:

±--------±----------±-------------±----------+
| id | movie | description | rating |
±--------±----------±-------------±----------+
| 5 | House card| Interesting| 9.1 |
| 1 | War | great 3D | 8.9 |
±--------±----------±-------------±----------+

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/not-boring-movies
普通的sql语句:

select *from cinema where description!='boring' and id%2!=0
order by rating desc;

使用位运算的sql语句:


# 210 ms
# , 在所有 MySQL 提交中击败了
# 77.53%
# 的用户
select id, movie, description, rating
from cinema
where description <> 'boring' and id & 1
order by rating desc;


LeetCode题目三 union关联查询和where 和or查询的比较

这里有张 World 表

±----------------±-----------±-----------±-------------±--------------+
| name | continent | area | population | gdp |
±----------------±-----------±-----------±-------------±--------------+
| Afghanistan | Asia | 652230 | 25500100 | 20343000 |
| Albania | Europe | 28748 | 2831741 | 12960000 |
| Algeria | Africa | 2381741 | 37100000 | 188681000 |
| Andorra | Europe | 468 | 78115 | 3712000 |
| Angola | Africa | 1246700 | 20609294 | 100990000 |
±----------------±-----------±-----------±-------------±--------------+
如果一个国家的面积超过 300 万平方公里,或者人口超过 2500 万,那么这个国家就是大国家。

编写一个 SQL 查询,输出表中所有大国家的名称、人口和面积。

例如,根据上表,我们应该输出:

±-------------±------------±-------------+
| name | population | area |
±-------------±------------±-------------+
| Afghanistan | 25500100 | 652230 |
| Algeria | 37100000 | 2381741 |
±-------------±------------±-------------+

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/big-countries

方法一使用where和or连接查询:

# 方法一:
# 执行用时:224 ms, 在所有 MySQL 提交中击败了60.35%的用户
select name,population,area from World where population>25000000
 or area>3000000   
# 方法二:
# 官方说方法二比方法一的的运行速度快,但是他们之间没有太大的差别
select name,population,area from World where population>25000000
union
select name,population,area from World where area>3000000 

猜你喜欢

转载自blog.csdn.net/houzhicongone/article/details/120580106