JAVA 阶段测试题-SQL

目录

1,什么是数据库索引?索引的种类有哪些?

2,什么情况下设置了索引但无法使用 (什么情况下索引会失效)?

3,说说对 SQL 语句优化有哪些方法?

4,Statement 接口与 PreparedStatement 接口区别

5,在进行数据库编程时,连接池有什么作用?

6,事务的ACID是指什么?


1,什么是数据库索引?索引的种类有哪些?

MySQL官方对索引的定义为:

索引(Index)是帮助MySQL高效获取数据的数据结构。

我们可以简单理解为:快速查找排好序的一种数据结构。

索引分类【效率从高到低】

1,主键索引

即主索引,根据主键建立索引,不允许重复,不允许空值;

2,唯一索引

用来建立索引的列的值必须是唯一的,允许空值

3,普通索引

用表中的普通列构建的索引,没有任何限制

4,全文索引

用大文本对象的列构建的索引。(比如用文章作为索引,可以将文章分为若干词,通过词建立索引,这样可以搜索词就能快速找到文章)

  • MYSQL5.6之前的版本中,全文索引只能用于MyISAM存储引擎
  • MYSQL5.6及以后的版本,MyISAM 和InnoDB均支持全文索引
  • 在之前的MySQL 中,全文索引只对英文有用,目前对中文还不支持(MYSQL8之后支持)

5,组合索引

用多个列组合构建的索引,这多个列中的值不允许有空值

2,什么情况下设置了索引但无法使用 (什么情况下索引会失效)?

内容摘自@ uweii【索引在什么情况下会失效】

1. 对于创建的多列索引(复合索引),不是使用的第一部分就不会使用索引

alter table student add index my_index(name, age)   // name左边的列, age 右边的列                                                              

select * from student where name = 'aaa'     // 会用到索引

select * from student where age = 18          //  不会使用索引

2. 对于使用 like 查询, 查询如果是 ‘%aaa’ 不会使用索引,而 ‘aaa%’ 会使用到索引。 

select * from student where name like 'aaa%'     // 会用到索引

select * from student where name like '%aaa'        或者   '_aaa'   //  不会使用索引

3. 如果条件中有 or, 有条件没有使用索引,即使其中有条件带索引也不会使用,换言之, 就是要求使用的所有字段,都必须单独使用时能使用索引。

4. 如果列类型是字符串,那么一定要在条件中使用引号引用起来,否则不使用索引。

5. 如果mysql认为全表扫面要比使用索引快,则不使用索引。

  • 如:表里只有一条数据。
     

3,说说对 SQL 语句优化有哪些方法?

内容摘自@百度经验【SQL语句常用的优化方法有哪些】

1,查询条件减少使用函数,避免全表扫描,减少不必要的表连接。有些数据操作的业务逻辑可以放到应用层进行实现,可以使用with as;

2,使用“临时表”暂存中间结果,不要把SQL语句写得太复杂,不能循环执行,查询用 exists 代替 in

3,表关联关系不要太纠结,查询多用索引列取查,用charindex或者like[0-9]来代替%%。inner关联的表可以先查出来,再去关联leftjoin的表

4,可以进行表关联数据拆分,即先查出核心数据,再通过核心数据查其他数据,这样会快得多

5,参考SQL执行顺序进行优化,表关联时取别名,也能提高效率,使用视图,给视图建立索引进行优化

6,使用数据仓库的形式,建立单独的表存储数据,根据时间戳定期更新数据。将多表关联的数据集中抽取存入一张表中,查询时单表查询,提高了查询效率

4,Statement 接口与 PreparedStatement 接口区别

内容摘自@HaleyTiger【Statement 接口和 PreparedStatement接口之间的区别】

关系: PreparedStatement接口继承自Statement接口。

区别:

1,PreparedStatement提高了代码的可读性和可维护性。

  • PreparedStatement使用占位符,容易理解,可读性强,而Statement使用字符串拼接,麻烦而且过长时可读性差。

2,PreparedStatement性能更高。

  • 创建PreparedStatement对象时使用SQL语句做参数,会解析并编译SQL语句。也可以使用带占位符“?”的SQL语句做参数,在通过setXxx()方法给占位符赋值后执行SQL语句时无需再解析和编译SQL语句,直接执行的。当进行批处理(多次执行相同操作)时,效率高。
  • 而创建Statement对象不使用SQL参数,不会解析并编译SQL语句,每次调用执行SQL语句时都要进行SQL语句的解析和编译操作,效率低。

3,PreparedStatement更安全。

  • PreparedStatement使用预编译处理,传入的任何参数都不会和已经预编译的SQL语句进行拼接,避免了SQL注入攻击问题。

5,在进行数据库编程时,连接池有什么作用?

内容摘自@黄元昌5533 【数据库连接池的作用与基本原理】

基本原理:

  • 为数据库连接建立一个“缓冲池”,预先在池中放入一定数量的数据库连接管道,需要时,从池子中取出管道进行使用,操作完毕后,在将管道放入池子中,从而避免了频繁的向数据库申请资源,释放资源带来的性能损耗。
  • 在如今的分布式系统当中,系统的QPS瓶颈往往就在数据库,所以理解数据库连接池底层构造原理与设计思想是很有益处的。我们常用的数据库连接池有C3P0, DBCP,Druid等。

优点:

①资源重用

  • 由于数据库连接得到重用,避免了频繁创建、释放连接引|起的大量性能开销。
  • 在减少系统消耗的基础上,增进了系统环境的平稳性(减少内存碎片以级数据库临时进程、线程的数量)

②更快的系统响应速度

  • 数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池内备用。此时连接池的初始化操作均已完成。
  • 对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。

③新的资源分配手段

  • 对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接技术。

④统一的连接管理,避免数据库连接泄露

  • 在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用的连接,从而避免了常规数据库连接操作中可能出现的资源泄露
     

6,事务的ACID是指什么?

摘自@&再见萤火虫&【05-数据库_数据库高级——七,MySql事务】

1,原子性(Atomicity)

  • 事务的原⼦性是指事务必须是⼀个原⼦的操作序列单元。
  • 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。
  • 事务执⾏过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发⽣⼀样。
  • 也就是说事务是⼀个不可分割的整体,就像化学中学过的原⼦,是物质构成的基本单位。

2,一致性(Consistency)

  • 事务的⼀致性是指事务的执⾏不能破坏数据库数据的完整性和⼀致性,⼀个事务在执⾏之前和执⾏之后,数据库都必须处以⼀致性状态。
  • ⽐如:如果从A账户转账到B账户,不可能因为A账户扣了钱,⽽B账户没有加钱。

3,隔离性(Isolation)

  • 事务的隔离性是指在并发环境中,并发的事务是互相隔离的。也就是说,不同的事务并发操作相同的数据时,每个事务都有各⾃完整的数据空间。
  • ⼀个事务内部的操作及使⽤的数据对其它并发事务是隔离的,并发执⾏的各个事务是不能互相⼲扰的。

4,持久性(Duration)

  • 事务的持久性是指事务⼀旦提交后,数据库中的数据必须被永久的保存下来。
  • 即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么⼀定能够将其恢复到事务成功结束后的状态。

猜你喜欢

转载自blog.csdn.net/qq_41528502/article/details/115063479