JAVA面試匯總(五)數據庫(四)

今天重回技術,寫一寫數據庫,今天第四篇。
  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)的區(qū)別
    (1)count(1)和count(
    )的作用都是檢索表中所有記錄行的數目,不論其是否包含null值。
    (2)count(1)比count()效率更高,這個先打個問號,后邊第4點第5點有解答
    (3)count(字段)的作用是檢索表中的這個字段的非空行數,不統(tǒng)計這個字段值為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區(qū)別
    (1)存儲內容(存儲到數據庫的格式),datetime為YYYY-MM-DD HH:MM:SS,固定占用8字節(jié)。timestamp為1970-01-01 00:00:00開始到現在的毫秒數,固定占用4或7字節(jié)。
    (2)均可以支持毫秒,datetime(n)表示可以支持n位的毫秒,timestamp不帶毫秒是4字節(jié),帶毫秒數時就變成了7字節(jié)。因此當只有4字節(jié)時,其最大只能記錄到'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的由于記錄的是毫秒數,因此可以有時區(qū)屬性。在任何時區(qū)不同的地方,都可以轉化為當地的時間。缺點是存儲的時間范圍有局限性(1970-01-01 00:00:00至2038-01-19 00:00:00)。
(5)什么時候使用timestamp合適呢?當系統(tǒng)記錄時間范圍不會超過(1970-01-01 00:00:00至2038-01-19 00:00:00)范圍,服務涉及跨時區(qū)的業(yè)務時,推薦使用timestamp類型。
(6)什么時候使用datetime合適呢?當系統(tǒng)記錄時間范圍會超過(1970-01-01 00:00:00至2038-01-19 00:00:00)范圍,例如生日,服務不涉及跨時區(qū)的業(yè)務時,推薦使用datetime類型。

  1. 什么是數據庫索引?
    (1)索引(index)是幫助MySQL高效獲取數據的數據結構(有效),在數據之外,數據庫系統(tǒng)還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據, 這樣就可以在這些數據結構上實現高級查找算法,這種數據結構就是索引。
    (2)說人話就是,幫助MySQL高效的查詢出數據的數據結構叫做索引,這個索引是單獨存儲在數據表數據之外的位置。

  2. MySQL的索引類型有哪些?
    MySQL中的索引類型有以下幾種,普通索引,唯一索引,主鍵索引,組合索引,全文索引
    (1)普通索引,最基本的索引,它沒有任何限制。

CREATE INDEX index_name ON table(column(length))

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

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

(3)主鍵索引,特殊的唯一索引,一個表只能有一個主鍵,不允許有空值。一般是在建表的時候同時創(chuàng)建主鍵索引。

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

(4)組合索引,指多個字段上創(chuàng)建的索引,只有在查詢條件中使用了創(chuàng)建索引時的第一個字段,索引才會被使用,但是如果數據重復過多不一定觸發(fā),建議組合索引中的多個字段共同使用。使用組合索引時遵循最左前綴集合(最左前綴:
顧名思義,就是最左優(yōu)先,如下例子,當創(chuàng)建了lname_fname_age組合索引,相當于創(chuàng)建了(lname)單列索引,(lname,fname)組合索引以及(lname,fname,age)組合索引,也就是優(yōu)先走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);

謝各位的閱讀,謝謝您動動手指點贊,萬分感謝各位。另外以下是我之前寫過的文章,感興趣的可以點進去繼續(xù)閱讀。

歷史文章

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基礎知識

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容