美文网首页小卜java
JAVA面试汇总(五)数据库(四)

JAVA面试汇总(五)数据库(四)

作者: 汤太咸啊 | 来源:发表于2022-09-04 13:37 被阅读0次
今天重回技术,写一写数据库,今天第四篇。
  1. MySQL的自增ID用完了,会怎么样?
    (1)先提供答案,新插入数据,会报唯一索引重复数据错误
//建表语句
CREATE TABLE `t_test` (
 `ID` int NOT NULL AUTO_INCREMENT,
 `name` varchar(10),
 PRIMARY KEY (`ID`)
);
//首先插入倒数第二大的id值
insert into t_test values (2147483646, 'test');
//再次插入,可以成功
insert into t_test (name) values ('test1');
//再次插入test2,报错
insert into t_test (name) values ('test2');
//错误信息
Duplicate entry '2147483647' for key 't_test.PRIMARY'

(2)因此可以得出结论,超过int的最大值后会报错
(3)可以修改为bigint类型,但是仍然有最大值大约2^64,达到最大值仍然会报错,但是要问一个问题,你的数据会达到这么大么?如果这么大数据量存储到MySQL数据库中,那么查询都是一个很大的问题,设计就不是很合理,不太适合MySQL

  1. Mysql count(),count(字段),count(1)的区别
    (1)count(1)和count(
    )的作用都是检索表中所有记录行的数目,不论其是否包含null值。
    (2)count(1)比count()效率更高,这个先打个问号,后边第4点第5点有解答
    (3)count(字段)的作用是检索表中的这个字段的非空行数,不统计这个字段值为null的记录
    (4)那么问题来了,为啥count(1)效率高呢?先看下MySQL的官方文档中的一句话:InnoDB handles SELECT COUNT(
    ) and SELECT COUNT(1) operations in the same way. There is no performance difference.翻译过来就是这俩我做了同样的处理,没有谁效率更高,都一样。
    (5)那么MySQL另一大引擎,MyISAM中呢?表会直接存储数据总行数,因此如果不带条件,count(*)会直接从这个总行数中查询,速度很快。但是如果带条件呢?同样是一行一行的读取,那么这个时候呢?我需要找数据跑一下,等我跑完再更新吧。

  2. MySql中数据类型datetime和timestamp区别
    (1)存储内容(存储到数据库的格式),datetime为YYYY-MM-DD HH:MM:SS,固定占用8字节。timestamp为1970-01-01 00:00:00开始到现在的毫秒数,固定占用4或7字节。
    (2)均可以支持毫秒,datetime(n)表示可以支持n位的毫秒,timestamp不带毫秒是4字节,带毫秒数时就变成了7字节。因此当只有4字节时,其最大只能记录到'2038-01-19 00:00:00'。
    (3)均可以设置默认值,可设置初始化值为当前时间,以及数据更新时自动更新修改时间。
    例如建表语句汇总:default current_timestamp表示默认当前时间,on update current_timestamp表示修改数据时自动更改为当前时间。

create_time datetime not null default current_timestamp on update current_timestamp
update_time timestamp not null default current_timestamp on update current_timestamp

(4)timestamp的由于记录的是毫秒数,因此可以有时区属性。在任何时区不同的地方,都可以转化为当地的时间。缺点是存储的时间范围有局限性(1970-01-01 00:00:00至2038-01-19 00:00:00)。
(5)什么时候使用timestamp合适呢?当系统记录时间范围不会超过(1970-01-01 00:00:00至2038-01-19 00:00:00)范围,服务涉及跨时区的业务时,推荐使用timestamp类型。
(6)什么时候使用datetime合适呢?当系统记录时间范围会超过(1970-01-01 00:00:00至2038-01-19 00:00:00)范围,例如生日,服务不涉及跨时区的业务时,推荐使用datetime类型。

  1. 什么是数据库索引?
    (1)索引(index)是帮助MySQL高效获取数据的数据结构(有效),在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
    (2)说人话就是,帮助MySQL高效的查询出数据的数据结构叫做索引,这个索引是单独存储在数据表数据之外的位置。

  2. MySQL的索引类型有哪些?
    MySQL中的索引类型有以下几种,普通索引,唯一索引,主键索引,组合索引,全文索引
    (1)普通索引,最基本的索引,它没有任何限制。

CREATE INDEX index_name ON table(column(length))

(2)唯一索引,索引列的值必须唯一,但允许有空值。

CREATE UNIQUE INDEX indexName ON table(column(length))

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

CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `title` char(255) NOT NULL,
    PRIMARY KEY (`id`)
);

(4)组合索引,指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用,但是如果数据重复过多不一定触发,建议组合索引中的多个字段共同使用。使用组合索引时遵循最左前缀集合(最左前缀:
顾名思义,就是最左优先,如下例子,当创建了lname_fname_age组合索引,相当于创建了(lname)单列索引,(lname,fname)组合索引以及(lname,fname,age)组合索引,也就是优先走lname单列索引)。

ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age);

(5)全文索引,主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。

CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT ,
    `title` char(255) CHARACTER NOT NULL ,
    `content` text CHARACTER NULL ,
    `time` int(10) NULL DEFAULT NULL ,    PRIMARY KEY (`id`),
    FULLTEXT (content)
);
CREATE FULLTEXT INDEX index_content ON article(content);

谢各位的阅读,谢谢您动动手指点赞,万分感谢各位。另外以下是我之前写过的文章,感兴趣的可以点进去继续阅读。

历史文章

Hadoop系列-入门安装
Hadoop系列-HDFS命令
Hadoop系列-Hive安装
Hadoop系列-Hive数据库常见SQL命令
Hadoop系列-HBase数据库
Hadoop系列-HBase数据库(二)
Hadoop系列-HBase数据库JAVA篇
Hadoop系列-Spark安装以及HelloWorld
JAVA面试汇总(五)数据库(一)
JAVA面试汇总(五)数据库(二)
JAVA面试汇总(五)数据库(三)
JAVA面试汇总(四)JVM(一)
JAVA面试汇总(四)JVM(二)
JAVA面试汇总(四)JVM(三)
JAVA面试汇总(三)集合(一)
JAVA面试汇总(三)集合(二)
JAVA面试汇总(三)集合(三)
JAVA面试汇总(三)集合(四)
JAVA面试汇总(二)多线程(一)
JAVA面试汇总(二)多线程(二)
JAVA面试汇总(二)多线程(三)
JAVA面试汇总(二)多线程(四)
JAVA面试汇总(二)多线程(五)
JAVA面试汇总(二)多线程(六)
JAVA面试汇总(二)多线程(七)
JAVA面试汇总(一)Java基础知识

相关文章

网友评论

    本文标题:JAVA面试汇总(五)数据库(四)

    本文链接:https://www.haomeiwen.com/subject/yfbknrtx.html