• 数据库常见问题合集


    数据库知识点

    • 事务的特性:

      • 是指由构成单个逻辑处理单元的一组数据库访问操作,这些操作的SQL语句被封装在一起,它们要么都被成功执行,要么都不被执行。
      • 在关系数据库中,一个事务程序可以由一条SQL语句组成,也可以由一组SQL语句组成。一个数据库应用程序可以包含一个事务程序,也可以包含多个事务程序。
    BEGIN;
    SQL语句1;
    SQL语句2;
    ...
    SQL语句n;
    COMMIT;
    //其中每条语句执行后,并不立即提交数据库,而是在执行COMMIT语句后,才将所有的SQL执行结果提交数据库。
    
    • 事务的特性:

      • 原子性、一致性、隔离性、持久性。
      • 原子性:事务中SQL语句对数据的修改操作,要么全部正确地执行,要么全部都不执行。
      • 一致性:事务的执行结果从数据库一种正确数据状态变迁到另一种正确数据状态。
      • 隔离性:当多个事务并发执行时,一个事务的执行不能被其他事务干扰,即各个并发事务之间不能相互影响。
      • 持续性:一个事务一旦提交,它对数据库中的数据的改变应该是永久的。
    • 事务并发运行时可能会出现的问题:脏读、不可重复读、幻像读、丢失更新问题

    • 三大范式:

      • 1>对属性的原子性约束,要求属性具有原子性,不可再分解.
      • 2>对记录要求有唯一性,通常设计一个主键来实现,主键不能包含业务逻辑.
      • 3>对字段冗余性约束,要求字段没有冗余.
    • 主键

      • 联合主键:设置多个字段同时为主键(PRIMARY KEY(Name, Age))
      • 复合主键:多个主键联合形成一个主键组合。(成绩表中的学号、课程标号)
    • 关系型数据库与NOSQL

      • 对比:
        • 1.关系型数据库通过外键关联来建立表与表之间的关系,
        • 2.非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定。
        • 3.非关系型数据库中,我们查询一条数据,结果出来一个数组,关系型数据库中,查询一条数据结果是一个对象。
      • 关系型数据库: Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL
      • 非关系型数据库:NOSQL(Not Only SQL)
      • NOSQL特点:用于高并发读写、海量数据的高效率存储和访问、高可扩展性和高可用性。
        • 易扩展,数据之间没有关系的。
        • 大数据量,高性能。高性能读写非常灵活的。
        • 灵活的数据模型。不需要事先对存储数据建立字段。
        • 高可用。
      • NOSQL主要主流产品:
        • Redis、CouchDB、mongoDB、Cassandra。
        • NOSQL中比较火的三个数据库Redis、Memchache、MongoDb。
    • 数据库优化

      • 1>数据库设计--三大范式
      • 2>数据库索引
      • 3>分表分库(水平分割,垂直分割)
      • 4>读写分离
      • 5>存储过程(模块化编程,可以提高速度)
      • 6>对MySQL配置优化(配置最大并发数my.ini,调整缓存大小)
      • 7>SQL调优
      • 8>定时清除不需要的数据,定时进行碎片整理
    • mysql怎么优化

      • 避免使用 select *
      • 当你只需要查询出一条数据的时候,要使用 limit 1
      • 建立高性能的索引
      • 建数据库表时,给字段设置固定合适的大小.
      • 要尽量使用not null
      • EXPLAIN 你的 SELECT 查询
      • 在Join表的时候,被用来Join的字段,应该是相同的类型的,且字段应该是被建过索引的,这样,MySQL内部会启动为你优化Join的SQL语句的机制。
      • 如果你有一个字段,比如“性别”,“国家”,“民族”, “省份”,“状态”或“部门”,这些字段的取值是有限而且固定的,那么,应该使用 ENUM 而不是 VARCHAR。
      • 垂直分割
      • 优化where查询
        • ①. 避免在where子句中对字段进行表达式操作
        • ②. 应尽量避免在 where 子句中使用 !=或<> 操作符,否则将引擎放弃使用索引而进行全表扫描。
        • ③. 应尽量避免在 where 子句中对字段进行 null 值 判断
        • ④. 应尽量避免在 where 子句中使用 or 来连接条件
      • 不建议使用%前缀模糊查询,这种查询会导致索引失效而进行全表扫描
      • 要慎用in和 not in
      • 理解in和exists, not in和not exists的区别
      • 理解select Count (*)和Select Count(1)以及Select Count(column)区别
    • 数据库的备份是如何实现的

      • 备份:bin>mysqldump -u root -p 要备份的数据库名>本地保存备份的路径+文件名
        • 不用进行登录,将数据库 test 备份 到c盘的test.sql 文件里:mysqldump -u root -p test >c:/test.sql
      • 恢复:bin>mysql -u root -p 要恢复的数据库名<本地保存备份的路径+文件名
        • MySQL -u root -p test < c:/test.sql
        • 恢复时需要创建一个空的数据库,再次对数据库进行查询时 表格 就会出来
      • 注:文件名后缀可以是txt,也可以是sql
    • MySQL中char、varchar和text三者的区别

      • 在MySQL中,char、varchar和text类型的字段都可以用来存储字符类型的数据,
      • char、varchar都可以指定最大的字符长度,但text不可以。
      • 它们的存储方式和数据的检索方式也都不一样。
      • 数据的检索效率是:char > varchar > text
      • 经常变化的字段用varchar;
      • 知道固定长度的用char;
      • 超过255字节的只能用varchar或者text;
      • 能用varchar的地方不用text;
      • 能够用数字类型的字段尽量选择数字类型而不用字符串类型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了;
      • 同一张表出现多个大字段,能合并时尽量合并,不能合并时考虑分表
    • 微服务

    • MVC

    • redis相关问题](https://baijiahao.baidu.com/s?id=1660009541007805174&wfr=spider&for=pc)

      • redis都有哪些了解
        • Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。
        • 它是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库。
        • Redis 作为一个内存数据库:
          • 性能优秀,数据在内存中,读写速度非常快,支持并发 10W QPS。单进程单线程,是线程安全的,采用 IO 多路复用机制。丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。支持数据持久化。可以将内存中数据保存在磁盘中,重启时加载。主从复制,哨兵,高可用。可以用作分布式锁。可以作为消息中间件使用,支持发布订阅
      • redis支持哪些数据类型
        • 支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
        • String
          • Redis 最基本的类型,一个 Key 对应一个 Value。Value 不仅是 String,也可以是数字。
          • String 类型是二进制安全的,意思是 Redis 的 String 类型可以包含任何数据,比如 jpg 图片或者序列化的对象。String 类型的值最大能存储 512M。
        • Hash
          • 一个键值(key-value)的集合。
          • Redis 的 Hash 是一个 String 的 Key 和 Value 的映射表,Hash 特别适合存储对象。常用命令:hget,hset,hgetall 等。
        • List 列表
          • 简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边) 常用命令:lpush、rpush、lpop、rpop、lrange(获取列表片段)等。
          • 数据结构:List 就是链表,可以用来当消息队列用。Redis 提供了 List 的 Push 和 Pop 操作,还提供了操作某一段的 API,可以直接查询或者删除某一段的元素。
          • 实现方式:Redis List 的是实现是一个双向链表,既可以支持反向查找和遍历,更方便操作,不过带来了额外的内存开销。
        • Set
          • String 类型的无序集合。集合是通过 hashtable 实现的。Set 中的元素是没有顺序的,而且是没有重复的。常用命令:sdd、spop、smembers、sunion 等。
          • 应用场景:Redis Set 对外提供的功能和 List 一样是一个列表,特殊之处在于 Set 是自动去重的,而且 Set 提供了判断某个成员是否在一个 Set 集合中。
        • Zset
          • 和 Set 一样是 String 类型元素的集合,且不允许重复的元素。常用命令:zadd、zrange、zrem、zcard 等。
          • 使用场景:Sorted Set 可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。
          • 当你需要一个有序的并且不重复的集合列表,那么可以选择 Sorted Set 结构。
          • 和 Set 相比,Sorted Set关联了一个 Double 类型权重的参数 Score,使得集合中的元素能够按照 Score 进行有序排列,Redis 正是通过分数来为集合中的成员进行从小到大的排序。
          • 实现方式:Redis Sorted Set 的内部使用 HashMap 和跳跃表(skipList)来保证数据的存储和有序,HashMap 里放的是成员到 Score 的映射。
      • redis是单线程还是多线程的,为什么这样设计?
        • 单进程单线程,是线程安全的。
          • 因为 Redis 完全是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。
          • 既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章的采用单线程的方案了(毕竟采用多线程会有很多麻烦)。
        • Redis 完全基于内存,绝大部分请求是纯粹的内存操作,非常迅速,数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度是 O(1)。数据结构简单,对数据操作也简单。
        • 采用单线程,避免了不必要的上下文切换和竞争条件,不存在多线程导致的 CPU 切换,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有死锁问题导致的性能消耗。使用多路复用 IO 模型,非阻塞 IO。
      • redis和mysql的区别总结
        • (1)类型上:从类型上来说,mysql是关系型数据库,redis是缓存数据库
        • (2)作用上:
          • mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢
          • redis用于存储使用较为频繁的数据到缓存中,读取速度快
        • (3)需求上:mysql和redis因为需求的不同,一般都是配合使用。

    SQL语句的考查

    • 学生成绩单里两门成绩>80的学生名字

      • SELECT S.name FROM Student S WHERE S.score > 80 GROUP BY S.name Having count(*)>=2;
      • 思路:先找成绩>80的数据,然后按住姓名分组,然后对分组后内容进行筛选。
      • 注:没有分组的情况下having和Where 类似,有分组的时候 Where 对分组前内容过滤,having是分组后的内容进行筛选。
        • having 里面可以写聚合函数,
    • 创建数据库:

      • CREATE DATABASE database_name;
    • mysql创建一个学生表,包含id(int)和name(string)

      • 主键的创建:CREATE TABLE stu(id INT (5), name VARCHAR (100), PRIMARY KEY (id));
    • mysql建立索引

      • CREATE INDEX index_name ON table_name (column_list) CREATE INDEX idx_c4 ON t(c4);
    • 数据库查询10-20行内容:

      • select * from stu limit 10, 10;
    • 查找135开头的电话:

      • select * from table where tel like '135%';
    • 查出“张”姓学生中平均成绩大于75分的学生信息

      • select * from student where name in (select name from student where name like '张%' group by name having avg(score) > 75)
    • 连接:内连接、外连接

    • left join, right join和inner join的影响性能的因素。

      • 如果两个表一样大,效率是一样的。
      • 如果两个表的数据量相来差很大,那效率上是有区别的。
      • 一般来说,小表去join大表,效率要比大表去join小表高的多。
      • 通常SQL会自动去选择百效率好的查询方案。但如果在join之前已经有很多的join,那SQL一般会按join出现的顺序进行查询。
      • 所以写SQL尽量度先查询和过滤数据量小的表,再去join大的表。
  • 相关阅读:
    Java多线程
    2018腾讯校招软件开发岗在线笔试题
    2018京东校招Java笔试题
    计模式之中介者、观察者
    值得注意的Java基础知识
    Java的内部类
    用静态内部类实现单例模式
    String,StringBuilder区别,一个是常量,一个是可变量
    ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象
    List<String> list=new ArrayList<String>(20);为什么要声明为List 而不是ArrayList<String>?
  • 原文地址:https://www.cnblogs.com/hanease/p/16167409.html
Copyright © 2020-2023  润新知