Java面试题集锦------数据库

1. count(1):指查找表的第一个字段来获取总条数,如果该字段允许为空则会得到错误的结果;

2. 事务四大特性:原子,一致,隔离,持久性;

3. 数据库引擎----MyIsam,InnoDB;

4. 数据库优化:

     (1)将相对固定的连接信息写入配置文件中,根据测试和生产等环境的不同,准备不同的参数配置文件;

     (2)用preparedstatement以批处理的方式操作数据库--addBatch(),一般每批500-100条语句;通过preparedstatement还可以防止sql注入;

     (3)使用连接池c3p0;

     (4)建立索引---聚集&非聚集,B-Tree索引,位图索引,全文索引;

     (5)sql优化;

     (6)合理建表,分库分表;

     (7)数据库引擎的选择(针对MySQL):

         InnoDB:

             1、ACID事务的支持,实现了四种隔离级别

              2、提供行级锁和外键约束,不支持全文索引且不保存表的行数

              3、锁的粒度更小,写操作且条件加索引不会锁全表,并发性好

                应用场景:在应用中执行大量insert和update操作

         MyISAM:

            1、不支持事务、行级锁和外键 ,insert和update会锁全表,效率较低 

             2、存储了表的行数,计数很快

               应用场景:大量select操作 

5. 数据库索引:

    •索引概念:

        数据列的值进行结构化排序的一个东西,SQL的主流索引结构有B+树以及Hash结构。

        聚集索引(主键索引,只有一个):索引的逻辑顺序与 数据行的物理存储顺序相同。

        非聚集索引(可以有多个):索引的逻辑顺序与 数据行的物理存储顺序不同。

    •常见索引:

       •1、普通索引:不附加任何限制条件,其值是否唯一和非空由字段本身的完整性约束条件决定            (INDEX)

       •2、唯一索引:索引列的值必须唯一,允许有空值(UNIQUE)

       •3、主键索引:一种特殊的唯一索引,一个表只能一个主键,不允许有空值。一般是在建表的时候同时创建主键索引                    (PRIMARY KEY )

       •4、组合索引:多个字段上创建的索引,前提第一个索引被使用才能有效(INDEX )

       •5、全文索引:建立在char、varchar,text类型上的索引,MyIsAM支持(FULLTEXT )

•注意事项:

•1、索引应该建立在经常select的字段上,过多索引占磁盘,经常insert、update和delete的

          不适合,因为需要维护索引文件,效率低

•2、索引不应包含含有NULL值的列,最好不要让字段默认为null

               1️⃣复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的。

               2️⃣MySQL难以优化引用了可空列的查询,它会使索引、索引统计和值更加复杂。

                  可空列需要更多的储存空间,还需要在MySQL内部进行特殊处理

•3、索引会无效的情况:

(1)、like模糊查询不以字母开头的,如like‘%han%’

(2)、在列上进行运算,如YEAR(column_name)<2018;

(3)、使用NOT IN 、<>、!=操作

(4)、字符串与数字比较不使用索引; CREATE TABLE `a` (`a` char(10)); 

                EXPLAIN SELECT * FROM `a` WHERE `a`="1" -- 走索引

                EXPLAIN SELECT * FROM `a` WHERE `a`=1 -- 不走索引

(5)、join操作中主键和外健数据类型不同

(6)、mysql估计使用全表扫描要比使用索引快的情况

6. sql表和语句优化:

一、语句相关优化:

1、in和 exist区别和应用场景

   select * from A where id in(select A_idfrom B);

   explain select * from A where exists(select B.A_idfrom B  where B.A_id= A.id);

  注: in先执行内表后执行外表,外表有索引,适合内表小,外表大的。 exist相反

            而且在使用not in的时候会使得索引失效,而not exist不会

2、能用between就不要用in:

        如果是连续数值,between在找到第一个匹配值后,则直接从该地址往后搜索,直到最后一个元素为止。

        这样就不会对后续值进行索引扫描,因此速度快了。 对于in操作可能会造成全索引进行扫描。

3、使用连接查询代替子查询

      子查询笛卡尔积重新组合后的过滤性能消耗高,使用连接查询代替

4、分组查询可以禁止排序:

      mysql在使用groupby的时候字段默认会对分组字段重新排序,可以加order by null 禁止排序

二、表相关优化:

1、保证update条件建立值唯一的索引

         update时如果where条件字段没有建立唯一索引,mysql会锁住整张表,其他线程会等待,所

         以我们在update时需要给where条件建立索引,提高并发能力。

         Lock in share mode(共享锁), for update(排它锁)

2、尽量使用数字型字段.

       字符型会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接会逐个比较字符串

       中每一个字符,而对于数字型而言只需要比较一次就够了。

3、固定长度的表会更快 

      固定的长度是很容易计算下一个数据的偏移量,读取快,如果字段不是定长的,那么,每一次要找下一条

      的话,需先找到主键 ,固定长度的表也更容易被缓存和重建 ,不过定长的会浪费空间。

4、ENUM代替VARCHAR
      ENUM类型实际保存的是TINYINT,如果字段的取值是有限而且固定的,可以使用ENUM提高性能

 

 

你可能感兴趣的:(Java)