炫“库”行动-人大金仓有奖征文-金仓库分析型数据库
Posted SmallCuteMonkey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了炫“库”行动-人大金仓有奖征文-金仓库分析型数据库相关的知识,希望对你有一定的参考价值。
文章目录
1.你有哪些数据库sql优化经验?
- 使用PrepareStatement语句,这个是经过预编译处理过的,比Statement的的速度要快。
- 如果数据的内容少,或者是有限的固定范围,可以使用Enum类型,而不是varchar类型
- 可以通过分布式的数据库系统增加数据库的性能,提高数据库的速度
- 可以通过不同的连接池来进行访问数据库的访问,比如Druid,HikariCP.HikariCp号称性能最好的连接池,这个是为什么?
- 使用Union进行连表查询比Union All进行连表查询可以大大提高性能,
Union好处:
6. 可以进行排序功能
7. 可以进行去除重复
- 可以使用单表查询的尽量使用单表,可以大大的提高查询的的速度,尽量少使用子查询
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
- 使用Truncate代替delete操作
当你真的确定删除这个表中的数据的时候使用 truncate删除表中的数据使用的资源很少,比delete使用的少很多,但是数据不可以被恢复。 - 不要在where子句中对数据库的字段进行null的判断,或者使用!=,这样会使mysql放弃索引,进行全表的扫描,效率低,in和not in 也要慎用,可以用between代替
- 索引不是越多越好,我们需要建立适当的索引,它会影响insert和update的执行的效率,一张表的索引最好不要超过6个。
- 避免频繁的创建和删除临时表,可以减少系统表的资源的消耗。
- 事务的操作不要过多,这样可以提高系统的并发能力。
用合适的方法生成相应的索引
索引可以用UUID.random().toString()进行生成,
和使用时间戳+随机数进行生成,这样的索引可以有唯一的标识。
使用雪花算法生成相应的id
- 刚开始的索引长度不要太长,可能会引起查询的效率的降低。可以使用subString()截取其中的一段就好。
- 数据库查询可以自定义变量来进行查询,力扣上面的题目很多老师自定义变量。
- 使用一些nosql数据库来为Mysql数据库进行减轻负担,比如查询放在缓存中,直接通过redis进行查询,它是单线程的,又是通过内存进行访问可以很大的提高效率,通过MongoDB来解决操作频繁的海量的数据,比如吐槽,评论的数据,不是特别重要。
- 数据库的表可以在需要建立外键约束。
- 有时候可以使用位运算来提高sql语句的运行速度问题。
2.使用Redis有什么好处?
- redis是依靠单线程来运行,这样性能更加的突出
- 可以进行持久化操作(AOF(日志文件),RDB(内存快照))
- 数据存储在内存中,速度快,类似于HashMap的查询,时间复杂度为o(1)
- 支持丰富的数据类型,String,set,sorted set,hash,list
- 支持事务操作,具有事务的ACID属性,要么一起改变,要么不发生改变
- 丰富的特性:可以为mysql数据库分担很多,用于缓存,消息,队列,计数器/排行榜,发布订阅点赞等等。
- 支持数据备份,通过master-slave进行数据的备份
3.Redis集群如何选择数据库?
目前无法做数据库选择,默认使用0数据库。
4.MongoDB的使用场景?
- 数据量大
- 写入操作频繁
- 价值较低
- 比如吐槽,评论可以使用这个数据库
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
方法一:可以对课程进行分组,然后统计每个课程的学生的数量
# 执行用时:
# 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
以上是关于炫“库”行动-人大金仓有奖征文-金仓库分析型数据库的主要内容,如果未能解决你的问题,请参考以下文章
炫“库”行动-人大金仓有奖征文,KingbaseES数据库经典排障记录