今天重回技术,写一写数据库,今天第四篇。
- 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
-
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(*)会直接从这个总行数中查询,速度很快。但是如果带条件呢?同样是一行一行的读取,那么这个时候呢?我需要找数据跑一下,等我跑完再更新吧。 -
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)索引(index)是帮助MySQL高效获取数据的数据结构(有效),在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
(2)说人话就是,帮助MySQL高效的查询出数据的数据结构叫做索引,这个索引是单独存储在数据表数据之外的位置。 -
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基础知识
网友评论